Слэш в конце адреса
Подскажите кто знает:
Как сделать, чтобы в конце адреса всегда проставлялся слеш?
Сейчас ситуация такая:
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, при переходе на сгенерированный урл — происходит редирект на оснвной урл, на котором работают фильтры. А если отметить чекбокс в фильтре — то урл выстраивается как надо. Есть возможность в плагине Василия это както пофиксить?
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.