Система управления контентом SantaFox
Разработчикам => Другое => Тема начата: DET от 13 сентября 2018, 17:02:57
-
Всем добрый . Вот и столкнулся с проблемой.
По новым требованиям РОСПОТРЕБНАДЗОРа - все сайты гос учреждения должны иметь одинаковую структуру. -Долго писать не буду : для примера
www.site.ru/sveden/info.html/
www.site.ru//sveden/document/ и т.д.
Пришло письмо от РОСПОТРЕБНАДЗОРа на школьный сайт. Исправить в ближ.время
Как так сделать?
-
Вот жеш не сидится им :(
-
Я вот подумал - а можно прописать ( сделать) уникальный ID так sveden/document
(https://c.radikal.ru/c04/1809/a3/ce1f25455d7b.jpg) (https://radikal.ru)
-
Может быть можно сделать как sveden-document.html, а модреврайтом менять все "-" на "/" ?
-
Подскажите как это сделать?
-
Увы. Мои знания в мод_реврайте нулевые. Но у нас по сути же ЧПУ так реализован. Надо посмотреть как там сделано
-
Буду ждать кто поможет мне в этой сложной ситуации. Прошу помогите.
-
К сожалению, адекватного решения нам найти не удалось. Пока никто не сообразил хороший модуль ЧПУ, мы придумали временное решение.
можно добавить фикс в точку входа 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-редирект.
-
сам редирект c "-" на "/" в htaccess будет такой
RewriteRule ^(.+)(\s|-)(.+)$ /$1/$3 [R=301,L]
но как это будет работать, особенно при включенным ЧПУ, не известно
-
Более нормальная реализация:
в самое начало 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);
}
}
}
Вроде бы так работает нормально.
-
Спасибо что помогаете .. Я не понимаю где менять в каком файле. можно попросить сбросить фаил index.php и куда мне его вставить .. Спасибо .
-
В корне сайта есть файл index.php. Сразу после <?php надо вставить код. Потом зайти в папку include, там будет второй файл frontoffice_manager.class.php. там найти строчку $kernel->priv_output($html, false, true); и вставить нужный кусок перед этой строчкой.
-
Что то не выходит у меня (Аленький цветочек).
Все делаю как в инструкции . Но после того как все заменил - сайт не открывается.
-
Есть какие-нибудь ошибки?
Надо смотреть, так подсказать сложно. Может у вас какие-то кастомные доделки ядра есть, может ещё что. На тестовом стенде всё прокатило, надо смотреть конкретно вашу реализацию