Система управления контентом SantaFox

Разработчикам => Другое => Тема начата: DET от 13 Сентябрь 2018, 17:02:57

Название: Роспотребнадзор попросил сделать
Отправлено: DET от 13 Сентябрь 2018, 17:02:57
Всем добрый . Вот и столкнулся с проблемой.
По новым требованиям РОСПОТРЕБНАДЗОРа - все сайты гос учреждения должны иметь одинаковую структуру.  -Долго писать не буду : для примера

www.site.ru/sveden/info.html/
www.site.ru//sveden/document/ и т.д.

Пришло письмо от РОСПОТРЕБНАДЗОРа на школьный сайт. Исправить в ближ.время

Как так сделать?
Название: Re: Роспотребнадзор попросил сделать
Отправлено: Oslix от 14 Сентябрь 2018, 11:27:13
Вот жеш не сидится им :(
Название: Re: Роспотребнадзор попросил сделать
Отправлено: DET от 15 Сентябрь 2018, 12:40:34
Я вот подумал - а можно прописать ( сделать) уникальный ID  так  sveden/document
(https://c.radikal.ru/c04/1809/a3/ce1f25455d7b.jpg) (https://radikal.ru)
Название: Re: Роспотребнадзор попросил сделать
Отправлено: Oslix от 17 Сентябрь 2018, 14:13:40
Может быть можно сделать как sveden-document.html, а модреврайтом менять все "-" на "/" ?
Название: Re: Роспотребнадзор попросил сделать
Отправлено: DET от 18 Сентябрь 2018, 08:43:14
Подскажите как это сделать?
Название: Re: Роспотребнадзор попросил сделать
Отправлено: Oslix от 18 Сентябрь 2018, 12:44:49
Увы. Мои знания в мод_реврайте нулевые. Но у нас по сути же ЧПУ так реализован. Надо посмотреть как там сделано
Название: Re: Роспотребнадзор попросил сделать
Отправлено: DET от 20 Сентябрь 2018, 08:20:13
Буду ждать кто поможет мне в этой сложной ситуации. Прошу помогите.
Название: Re: Роспотребнадзор попросил сделать
Отправлено: Acho от 20 Сентябрь 2018, 14:39:29
К сожалению, адекватного решения нам найти не удалось. Пока никто не сообразил хороший модуль ЧПУ, мы придумали временное решение.
можно добавить фикс в точку входа 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-редирект.
Название: Re: Роспотребнадзор попросил сделать
Отправлено: Nikodim от 20 Сентябрь 2018, 14:49:26
сам редирект c "-" на "/" в htaccess будет такой
RewriteRule ^(.+)(\s|-)(.+)$ /$1/$3 [R=301,L]
но как это будет работать, особенно при включенным ЧПУ, не известно
Название: Re: Роспотребнадзор попросил сделать
Отправлено: Acho от 20 Сентябрь 2018, 19:12:33
Более нормальная реализация:
в самое начало 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);
}
}
}

Вроде бы так работает нормально.
Название: Re: Роспотребнадзор попросил сделать
Отправлено: DET от 21 Сентябрь 2018, 07:40:34
Спасибо что помогаете .. Я не понимаю где менять в каком файле. можно попросить сбросить фаил index.php и куда мне его вставить .. Спасибо .
Название: Re: Роспотребнадзор попросил сделать
Отправлено: Acho от 21 Сентябрь 2018, 11:52:54
В корне сайта есть файл index.php. Сразу после <?php надо вставить код. Потом зайти в папку include, там будет второй файл frontoffice_manager.class.php. там найти строчку $kernel->priv_output($html, false, true); и вставить нужный кусок перед этой строчкой.
Название: Re: Роспотребнадзор попросил сделать
Отправлено: DET от 24 Сентябрь 2018, 15:51:01
Что то не выходит у меня (Аленький цветочек).
Все делаю как в инструкции . Но после того как все заменил - сайт не открывается.
 
Название: Re: Роспотребнадзор попросил сделать
Отправлено: Acho от 27 Сентябрь 2018, 12:11:02
Есть какие-нибудь ошибки?
Надо смотреть, так подсказать сложно. Может у вас какие-то кастомные доделки ядра есть, может ещё что. На тестовом стенде всё прокатило, надо смотреть конкретно вашу реализацию