Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Сообщения - Acho

Страницы: [1]
1
Есть какие-нибудь ошибки?
Надо смотреть, так подсказать сложно. Может у вас какие-то кастомные доделки ядра есть, может ещё что. На тестовом стенде всё прокатило, надо смотреть конкретно вашу реализацию

2
В корне сайта есть файл index.php. Сразу после <?php надо вставить код. Потом зайти в папку include, там будет второй файл frontoffice_manager.class.php. там найти строчку $kernel->priv_output($html, false, true); и вставить нужный кусок перед этой строчкой.

3
Более нормальная реализация:
в самое начало index.php
$_serverUri = parse_url($_SERVER["REQUEST_URI"],PHP_URL_PATH);
$_serverQuery = parse_url($_SERVER["REQUEST_URI"],PHP_URL_QUERY);

if (strpos($_serverUri, ".html") !== false) {
  $_redirUri = str_replace("-", "/", rtrim($_serverUri, ".html"));
  $_redirUri .= !$_serverQuery ?: "?" . $_serverQuery;
  header("HTTP/1.1 301 Moved Permanently");
  header("Location: " . $_redirUri );
  exit();
}

$_serverUri = "/" . str_replace("/", "-", ltrim($_serverUri, "/"));
$_serverUri .= ".html?" . $_serverQuery;

$_SERVER["REQUEST_URI"] = $_serverUri;

Чтобы пофиксить все ссылки по сайту, я сделал фикс во фронтконтроллере:
include/frontoffice_manager.class.php
в методе Start() последняя строка
$kernel->priv_output($html, false, true);Перед ней добавить:
$_dom = new DOMDocument;
$_dom->loadHTML($html);
$_escSymbol = ["mailto:","javascript:"];

foreach ($_dom->getElementsByTagName('a') as $_node) {
if ($_node->hasAttribute( 'href' )) {
$_a = $_node->getAttribute( 'href' );
$_aUri = parse_url($_a,PHP_URL_PATH);
$_aQuery = parse_url($_a,PHP_URL_QUERY);

if (strpos($_a, "mailto:") || strpos($_a, "javascript:") || $_aUri == "/") continue;

if (strpos($_aUri, ".html") !== false) {
$_aUri = str_replace("-", "/", rtrim($_aUri, ".html"));
$_aUri .= !$_aQuery ? false : "?" . $_aQuery;
if (mb_substr($_aUri,0,1) != "/") $_aUri = "/" . $_aUri;
$html = str_replace($_a,$_aUri,$html);
}
}
}

Вроде бы так работает нормально.

4
К сожалению, адекватного решения нам найти не удалось. Пока никто не сообразил хороший модуль ЧПУ, мы придумали временное решение.
можно добавить фикс в точку входа index.php (в самое начало файла):
/**
* Fix by RPN (fix link)
*/
$_serverUri = trim($_SERVER["REQUEST_URI"],"/");
$_expServerUri = explode("?",$_serverUri);

function str_replace_once($search, $replace, $text)
{
   $pos = strpos($text, $search);
   return $pos!==false ? substr_replace($text, $replace, $pos, strlen($search)) : $text;
}

if (strpos($_expServerUri[0],".html") !== false) {
$_expServerUri[0] = str_replace("-","/",$_expServerUri[0]);
$_expServerUri[0] = str_replace(".html","",$_expServerUri[0]);
if (count($_expServerUri) == 1) {
$_redirUri = "/" . $_expServerUri[0];
}
else {
$_redirUri = "/" . implode("?",$_expServerUri);
}

header("HTTP/1.1 301 Moved Permanently");
header("Location: " . $_redirUri);
exit();
}

$_expServerUri[0] = str_replace("/","-",$_expServerUri[0]);
if (strpos($_expServerUri[0],"?") !== false) {
$_expServerUri[0] = str_replace_once("?",".html?",$_expServerUri[0]);
$_serverUri = "/".implode("?",$_expServerUri);
}
else {
$_expServerUri[0] .= ".html";
$_serverUri = "/".implode("?",$_expServerUri);
}
$_SERVER["REQUEST_URI"] = $_serverUri;

Сделать тоже самое на уровне апача у нас не получилось.

И с этим решением файл .htaccess в базовом варианте должен выглядеть так:
RewriteBase /
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule   ^.*$ index.php

AddDefaultCharset UTF-8
AddType text/x-component .htc

В итоге всё работает ровно до того момента, пока не появляются многоуровневые url. Может у вас это не повторится, но на моём тестовом движке ссылки генерируются относительно страницы, а не корня сайта. Т.е. на странице site.ru/level1/level2 ссылки на каталог будут следующими: site.ru/level1/level2/catalog?cid=1. Фиксится изменением относительности от страницы относительностью от корня (вместо ссылки catalog.html?cid=1 писать /catalog.html?cid=1).

Многоуровневые урлы делаются просто: в id страницы указываем, например, catalog-filter-apple, в старом варианте страница бы выглядела как site.ru/catalog-filter-apple.html, с этим фиксом будет site.ru/catalog/filter/apple.

Ну и как рудимент ссылки на странице генерируемые остаются старого образца, но при переходе по ним будет происходить 301-редирект.

Страницы: [1]