1) Переходим в раздел Типы содержимого (Содержимое->Типы содержимого) и для типа html меняем параметр Расширение с .html на /
2) Ваши страницы будут доступны по адресам имя_сайта/адрес_страницы/
Однако, они будут так же доступны и по адресам без слеша на конце, что не очень хорошо для SEO. Поэтому нам нужно сделать 301 редирект при обращении к страницам без слеша на конце на такую же, но только со слешем.
3) Создаем плагин (имя на ваш вкус).
На вкладке Системные события выбираем OnHandleRequest
Код плагина:
<?php
/*Переадресация с адресов, заканчивающихся без слеша / на адреса со слешем / */
$url=$_SERVER['REQUEST_URI'];
if($_SERVER['HTTPS']=='on'){$http='https';}else{$http='http';}
if(substr($url,0,6)=='/index'){
header("HTTP/1.1 301 Moved Permanently");
header("Location: ".$http."://".$_SERVER['HTTP_HOST']);
exit();
}
$exclude=array('.xml','.txt','.ico','.yml','json','.php','html','.pdf','.svg'); //массив исключений - какие адреса могут формироваться системой
$query_str=strstr($_SERVER['REQUEST_URI'],'?'); //Если в адресе есть параметры (например ?a=something123 )
if($query_str!=''){
$url=substr($url,0,strpos($url,$query_str)); //Отделяем параметры от адреса
}
if(!in_array(substr($url,-4), $exclude) and substr($url,-1)!='/' and stripos($url,'bannerclick')==0){
$url=substr($url,1).'/'; //убираем / в начале и добавляем в конце
$obj=$modx->getObject('modResource',array('uri'=>$url));
if(!$obj){
header("HTTP/1.1 404 Not Found");
}elseif($obj->get('published')==1){
header("HTTP/1.1 301 Moved Permanently");
header("Location: ".$http."://".$_SERVER['HTTP_HOST'].'/'.$url.$query_str);
exit();
}else{
header("HTTP/1.1 404 Not Found");
exit();
}
}Сохраняем. Проверяем…
Надеюсь, пригодится кому.

Алексей Либер 27.03.2018 14:03 #
Плюс к этому: не проще сделать тоже самое через htaccess?