Слэш в конце адреса
        Подскажите кто знает:
Как сделать, чтобы в конце адреса всегда проставлялся слеш?
Сейчас ситуация такая:
site.ru — всегда без слеша на конце (пусть так и будет)
site.ru/catalog/ — ведет себя непонятно, на части страниц слэш подставляется, на части страниц доступно и со слэшем и без.
site.ru/catalog/podcatalog — доступен и со слешем и без него (а надо только со слешем)
site.ru/page.html — всегда без слэша (так и должно быть)
Я так понимаю настаивать надо nginx. Сервер настраивал по этой инструкции. От себя ничего не писал, не настраивал.
Кстати у Василия тоже примерно такая ситуация:
http://bezumkin.ru/index — всегда без слэша
http://bezumkin.ru/sections/ — и так и так доступно.
    
    
                                                                                
            Как сделать, чтобы в конце адреса всегда проставлялся слеш?
Сейчас ситуация такая:
site.ru — всегда без слеша на конце (пусть так и будет)
site.ru/catalog/ — ведет себя непонятно, на части страниц слэш подставляется, на части страниц доступно и со слэшем и без.
site.ru/catalog/podcatalog — доступен и со слешем и без него (а надо только со слешем)
site.ru/page.html — всегда без слэша (так и должно быть)
Я так понимаю настаивать надо nginx. Сервер настраивал по этой инструкции. От себя ничего не писал, не настраивал.
Кстати у Василия тоже примерно такая ситуация:
http://bezumkin.ru/index — всегда без слэша
http://bezumkin.ru/sections/ — и так и так доступно.
Комментарии: 44
                Валисия это мало заботит, но ты можешь написать свой плагин, который при загрзке веб-страницы будет проверять её свойста, и запрошенный адрес. Если нет слеша — отправлять на него.
Хотя, в настройках MODX вроде есть strict_urls — они должны делать тоже самое, проверь.
                    Хотя, в настройках MODX вроде есть strict_urls — они должны делать тоже самое, проверь.
                strict_urls будут добавлять\не добалять слешы к адресу, но страницы будут доступны и так и так. Чтобы жестко указать надо делать 301 редирект в nginx. например
будет убирать слеш
                    location ~ .+/$ {
rewrite (.+)/$ $1 permanent;
} будет убирать слеш
                Спасибо за решение, но все же хочется, чтобы слэш в конце был. Есть такой вариант?             
                    
                ну так слеш переставить то))
                    location ~ .+/$ {
rewrite (.+)$ $1/ permanent;
}или так rewrite ^(.+[^/])$ $1/ permanent;            
                Первый вариант — всегда добавляет в конец 2 слэша.
Второй — периодически выдает 404 Not Found
Оставлю
Спасибо большое.
                    Второй — периодически выдает 404 Not Found
Оставлю
location ~ .+/$ {
rewrite (.+)/$ $1 permanent;
}Так работает.Спасибо большое.
                Ага, не тут-то было, на сайте все нормально, а в админке:
                    Firefox определил, что сервер перенаправляет запрос на этот адрес таким образом, что он никогда не завершится.
                Попробуй так
                    location ^~ /manager {
	location ~* \.php$ {
		include             fastcgi_params;
		fastcgi_param       SCRIPT_FILENAME $document_root$fastcgi_script_name;
		fastcgi_pass        backend-?????????;
	}
}
location ~ .+/$ {
rewrite (.+)/$ $1 permanent;
}            
                один фиг не работает
            
                    
                А настройки в системных параметрах core container_suffix "/" у вас стоит?            
                    
                Да            
                    location / {
	try_files			$uri $uri/ @rewrite;
}
location @rewrite {
	# добавить слэш в конце
	rewrite			(.*[^/])$ $scheme://$host$1/ permanent;
	# удалить слэш в конце
	#rewrite		(.*)/$ $scheme://$host$1 permanent;
	rewrite			^/(.*)$ /index.php?q=$1 last;
}Только имейте в виду, что в самом modx настройка для html в «Типах файлов» должна быть пустой. Иначе, если у вас добавляется, к примеру, ".html" к адресам страниц, то nginx исправит его на ".html/", а вы получите 404. Так что аккуратнее.            
                Оживлю тему.
В общем условия такие:
если:
— адрес не содержит «sitename.ru/*.*» (т.е. в конце адреса *.html или *.jpg или еще какое-то расширение)
и
— в конце адреса нет слеша
и
— адрес не содержит «sitename.ru/manager*»
и
— это не главная страница (sitename.ru)
то добавлять в конец адреса слеш.
Прочитал уже про регулярные выражения. Уже представляю как прописать эти условия по отдельности, но не знаю как применить эти условия (конкретно отрицания) в nginx и прописать все это в одном условии.
Кто силен в этом, помогите пожалуйста.
                    В общем условия такие:
если:
— адрес не содержит «sitename.ru/*.*» (т.е. в конце адреса *.html или *.jpg или еще какое-то расширение)
и
— в конце адреса нет слеша
и
— адрес не содержит «sitename.ru/manager*»
и
— это не главная страница (sitename.ru)
то добавлять в конец адреса слеш.
Прочитал уже про регулярные выражения. Уже представляю как прописать эти условия по отдельности, но не знаю как применить эти условия (конкретно отрицания) в nginx и прописать все это в одном условии.
Кто силен в этом, помогите пожалуйста.
                Можно это сделать и без nginx — плагином на OnHandleRequest.            
                    
                Василий, спасибо за ответ.
В общем, вот что я наваял:
И еще вопрос: админка при таком условии обрабатываться не должна?
P.S. Над кодом прошу не смеяться
                    В общем, вот что я наваял:
$url = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];//Узнаем текущий URL
$last = strlen($url) - 1;//Узнаем позицию последнего символа URL'a
$slash = $url{$last};//Узнаем последний символ URL'a
$id = $modx->getObject('modResource',$modx->resource->get('id'));//Узнаем ID ресурса
$cat = $id->get('isofolder');//Узнаем тип ресурса (каталог или документ)
if ($cat == '1' && $slash != '/'){//Если это каталог и в конце URL'a нет слэша,
    header("HTTP/1.1 301 Moved Permanently");//то вставляем эти заголовки.
    header("Location: $url/");
    exit();
}Но получаю ошибку 500. Что не так делаю?И еще вопрос: админка при таком условии обрабатываться не должна?
P.S. Над кодом прошу не смеяться
                Если ты хочешь работать с ресурсом, то OnHandleRequest — слишком раннее событие, он там еще не загружен. Это событие срабатывает в самом начале обработки запроса, именно поэтому его можно использовать как php-замену правилам nginx.
А плагин для редиректа на канонический uri документа-контейнера выглядит так:
                    А плагин для редиректа на канонический uri документа-контейнера выглядит так:
<?php
if ($modx->event->name == 'OnLoadWebDocument') {
	$uri = $_SERVER['REQUEST_URI'];
	if ($modx->resource->isfolder && substr($uri, -1) != '/') {
		$modx->sendRedirect($modx->makeUrl($modx->resource->id));
	}
}            
                Василий, спасибо тебе большое!
От себя добавлю: sendRedirect — по умолчанию делает 302 редирект, для 301
                    От себя добавлю: sendRedirect — по умолчанию делает 302 редирект, для 301
$modx->sendRedirect($modx->makeUrl($modx->resource->id),array('responseCode' => 'HTTP/1.1 301 Moved Permanently'));            
                Василий, снова я тебя потревожу.
Плагин работает отлично! Столкнулся с такой ситуацией: в категории при пагинации на другую страницу (напр.: site.ru/category/?page=2) при переходе она нормально отображается, а если этот адрес отрыть в новой вкладке или браузере, то плагин редиректит на site.ru/category/ что несколько неудобно, если требуется отправить такую ссылку по почте, да и страницы эти из поисков повылетают со временем.
Помоги решить, пожалуйста.
                    Плагин работает отлично! Столкнулся с такой ситуацией: в категории при пагинации на другую страницу (напр.: site.ru/category/?page=2) при переходе она нормально отображается, а если этот адрес отрыть в новой вкладке или браузере, то плагин редиректит на site.ru/category/ что несколько неудобно, если требуется отправить такую ссылку по почте, да и страницы эти из поисков повылетают со временем.
Помоги решить, пожалуйста.
if ($modx->resource->isfolder && substr($uri, -1) != '/' && !$_GET['page']) {Уж это-то элементарно…            
                Большое спасибо!
                    Уж это-то элементарно…не сомневаюсь… Начинал я изучать PHP, но что-то как-то сложно.
                Тогда понятно)            
                    
                А если пагинация сделана через AJAX и перезагрузки страницы не происходит, как в таком случае быть? Подскажите?            
                    
                Ну, вот. Снова…
С page разобрались, а вот при фильтрации через mFilter то же самое, что и тут
                    С page разобрались, а вот при фильтрации через mFilter то же самое, что и тут
                Если кому-то интересно, решил все кардинально:
                    if ($modx->event->name == 'OnLoadWebDocument') {
	$uri = $_SERVER['REQUEST_URI'];
	if ($modx->resource->isfolder && substr($uri, -1) != '/' && !strpos($uri, '?')) {
		$modx->sendRedirect($modx->makeUrl($modx->resource->id),array('responseCode' => 'HTTP/1.1 301 Moved Permanently'));
	}
}            
                Так и надо!            
                    
                а проблему с index.php/хотьчто/ решал кто нибудь?            
                    
                Вот до этого и внимания не обращал.
Лично у меня с «index.php/хотьчто/» все нормально 404 ошибка. А вот «site.ru/index.php» работает. Прописал в nginx (по аналогии с index.html):
Также есть проблемы с:
site.ru/catalogue/index.html(.php) -> редирект на site.ru// (именно два слеша на конце), а должно быть на site.ru/catalugue/
если на главной или в категории в конце поставить сколько угодно слешей, то страница все равно отдаст код 200
                    Лично у меня с «index.php/хотьчто/» все нормально 404 ошибка. А вот «site.ru/index.php» работает. Прописал в nginx (по аналогии с index.html):
location /index.php {
                rewrite                 / / permanent;
        }результата не дало.Также есть проблемы с:
site.ru/catalogue/index.html(.php) -> редирект на site.ru// (именно два слеша на конце), а должно быть на site.ru/catalugue/
если на главной или в категории в конце поставить сколько угодно слешей, то страница все равно отдаст код 200
                про много слэшей даже яндекс грешен www.yandex.ru/////
я сделал 404 на /catalog/index.php, а когда сайт.ru/index.php 301 на /.
меня больше заботит index.php/хотьчто/, т.к. сайт был раньше на Джумле с таким ссылками, сейчас на revo, а ссылки эти кривые остались в индексе и отдают 200 код. Сейчас еще два других сайта проиндексируются с index.php/хотьчто/ так как на них проверил этот баг ))))
                    я сделал 404 на /catalog/index.php, а когда сайт.ru/index.php 301 на /.
меня больше заботит index.php/хотьчто/, т.к. сайт был раньше на Джумле с таким ссылками, сейчас на revo, а ссылки эти кривые остались в индексе и отдают 200 код. Сейчас еще два других сайта проиндексируются с index.php/хотьчто/ так как на них проверил этот баг ))))
                Вообще, если это перенос, то по хорошему нужно всем старым страницам нужно прописать редиректы на новые страницы, тогда Redirector в помощь. А так, если 404 станица настроена, MODx сам на нее должен редиректить. В том же Redirector'e можно настроить редирект на 404. Ну и как вариант в robots.txt поставить запрет на индексацию.            
                    
                да походу я заработался ))) RewriteRule ^index.php/(.*)$ / [R=permanent,L]            
                    
                Это вставлять в index.php после вызова MODX_API?            
                    
                Нужно создать плагин и повесить его на событие «OnLoadWebDocument».            
                    
                Как добавить слеш в конце адреса к обычным ресурсам? К примеру используя плагин от Вac слеш есть у всех ресурсов-контейнеров, а у тех, что без «дочерних» его нету. При выставлении галки «контейнер» — появляется. Но нужно, что бы у всех урлов был слеш (кроме главной).            
                    
                Нет ничего проще. В системных настройках заменить суффикс для ресурсов «html» на "/".            
                    
                не помогает. ресурс доступен со слешем и без, если оставить настройку пустой — сам убирает.            
                    
                Смысл твоего вопроса был в чем — как добавить слеш в конце адреса ресурса. Я тебе ответил. Как убрать дубль — это другой вопрос. Обсуждалось сто раз. Читай            
                    
                а если в .htaccess то что надо прописать?
Писал так:
                    Писал так:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ /$1/ [R=301,L]и так:RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*[^/])$ $1/ [L,R=301]результата нет. Что делаю не так?            
                еще пробовал вот так:
                    # Remove trailing slash
RewriteRule ^(manager)/*$ — [L] # exclude manager folder
RewriteCond %{REQUEST_URI} (.*)/
RewriteRule ^(.*)/$ example.com/$1 [R=301,L]результата ноль. Кто сталкивался с такой проблемой и решил ее?            
                Постарался чуть более универсальное решение написать для тех случаев, когда обратный слеш нужен не только для папок, но и для документов.
Те. сайт/категория/товар/
                    Те. сайт/категория/товар/
<?php
if ($modx->context->key == 'mgr') {return;}
$uri=$_SERVER['REQUEST_URI'];
if (substr($uri, -1) != '/' && $uri != '/' && !strpos($uri, '?')&& !strpos($uri, '.')) {
	$url = $modx->getOption('site_url');
	if(substr($url, -1)=='/'){
		$url=substr($url, 0, -1);
	}
	$url .= $uri.'/';
	$modx->sendRedirect($url,array('responseCode' => 'HTTP/1.1 301 Moved Permanently'));
}            
                Простите я новичок в модкс. Не подскажете куда вот это чудо надо вписать?            
                    
                Нужно создать плагин и в него поместить этот код. В настройках указать событие OnHandleRequest            
                    
                Николай, подскажите, а можно ли как то добавить условие, чтоб у конкретных страниц редирект был на без /, а остальные на с /            
                    
                Здравствуйте!
Возможно ли в этом коде также прописать редирект с .html в конце /, то есть, убрать точку с html и вместо добавить слеш?
У меня на сайте дочерние ресурсы были с .html в конце url. Но я их сделала контейнерами и теперь они стали со слеш. А автоматического редиректа не происходит. Пожалуйста, посоветуйте, как исправить это? Спасибо!
                    Возможно ли в этом коде также прописать редирект с .html в конце /, то есть, убрать точку с html и вместо добавить слеш?
У меня на сайте дочерние ресурсы были с .html в конце url. Но я их сделала контейнерами и теперь они стали со слеш. А автоматического редиректа не происходит. Пожалуйста, посоветуйте, как исправить это? Спасибо!
                Вот пример слеша для контейнеров 
                    if ($modx->event->name == 'OnWebPagePrerender')
{
    if ($modx->resource->get('isfolder') == 1)
    {
        $rest = substr($_SERVER['REQUEST_URI'], -1);
        if ($rest != '/')
        {
            header("Location: " . $_SERVER['REQUEST_URI'] . "/");
            exit;
        }
    }
}            
                Настраил seoFilter, при переходе на сгенерированный урл — происходит редирект на оснвной урл, на котором работают фильтры. А если отметить чекбокс в фильтре — то урл выстраивается как надо. Есть возможность в плагине Василия это както пофиксить?            
                    
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.