Добавьте косую черту в конец каждого URL-адреса (нужно переписать правило для nginx)
Я пытаюсь получить "/" для каждого конца URL:
example.com/art
должен
example.com/art/
Я использую nginx в качестве веб-сервера.
Мне нужно правило перезаписи для этого.
Для лучшего понимания проверьте это:
http://3much.schnickschnack.info/art/projekte
Если вы нажмете маленькую миниатюру под большим рисунком, она перезагрузится и отобразит этот URL:
http://3much.schnickschnack.info/art/projekte/#0
Если теперь у меня есть косая черта во всех URL-адресах (в конце), это будет работать без перезагрузки сайта.
Сейчас у меня есть эти настройки в nginx-http.conf:
server {
listen *:80;
server_name 3much.schnickschnack.info;
access_log /data/plone/deamon/var/log/main-plone-access.log;
rewrite ^/(.*)$ /VirtualHostBase/http/3much.schnickschnack.info:80/2much/VirtualHostRoot/$1 last;
location / {
proxy_pass http://cache;
}
}
Как настроить nginx для добавления косой черты? (Я думаю, что я должен переписать правило?)
Ответы
Ответ 1
Скорее всего, я думаю, вам нужно что-то вроде этого:
rewrite ^([^.]*[^/])$ $1/ permanent;
Регулярное выражение преобразуется в:
"переписывайте все URI без каких-либо". в них, которые не заканчиваются "/" на URI + '/' "Или просто:" Если URI не имеет периода и не заканчивается косой чертой, добавьте косую черту в конец"
Причина только перезаписи URI без точек в них делает так, чтобы любой файл с расширением файла не переписывался. Например, ваши изображения, css, javascript и т.д. И предотвратите возможные циклы переадресации, если вы используете некоторую фрейм-структуру, которая также выполняет собственные перезаписывания.
Другим распространенным переписанием для сопровождения будет следующее:
rewrite ^([^.]*)$ /index.php;
Это очень просто перезаписывает все URI, у которых нет периодов в них, к вашему index.php(или к любому другому файлу, из которого вы бы выполнили свой контроллер).
Ответ 2
rewrite ^([^.\?]*[^/])$ $1/ permanent;
чтобы избежать повторений с URL-адреса покоя, получающего/помеченный.
например.
/myrest/делать? Д = 12345
Ответ 3
Для nginx:
rewrite ^(.*[^/])$ $1/ permanent;
Ответ 4
используя переписывание из anthonysomerset в Wordpress, я экспериментировал с проблемами, связанными с панелью /wp -admin из-за цикла перенаправления. Но я решаю эту проблему, используя указанное условие:
if ($request_uri !~ "^/wp-admin")
{
rewrite ^([^.]*[^/])$ $1/ permanent;
rewrite ^([^.]*)$ /index.php;
}
Ответ 5
server {
# ... omissis ...
# put this before your locations
rewrite ^(/.*[^/])$ $1/ permanent;
# ... omissis ...
}
Если вы хотите, чтобы какие-то запросы (скажем, кроме GET
) были исключены из этого (обычно это запросы POST
, а rewrite
превращает любой метод запроса в GET
, что может нарушить некоторые из ваших динамических функций вашего сайта), добавьте предложение if
:
server {
# ... omissis ...
# put this before your locations
if ($request_method = "GET" ) {
rewrite ^(/.*[^/])$ $1/ permanent;
}
# ... omissis ...
}
Вы также можете поместить rewrite
в блок location
(if
тоже), чтобы сделать его более конкретным.
Ответ 6
это слишком поздно, но я хочу поделиться своим решением, я встретил проблему с завершающим косой чертой и nginx.
#case :
# 1. abc.com/xyz => abc.com/xyz/
# 2. abc.com/xyz/ => abc.com/xyz/
# 3. abc.com/xyz?123&how=towork => abc.com/xyz/?123&how=towork
# 4. abc.com/xyz/?123&ho=towork => abc.com/xyz/?123&how=towork
и это мое решение
server {
....
# check if request isn't static file
if ($request_filename !~* .(gif|html|jpe?g|png|json|ico|js|css|flv|swf|pdf|xml)$ ) {
rewrite (^[^?]+[^/?])([^/]*)$ $1/$2 permanent;
}
....
location / {
....
}
}
Ответ 7
Странно, что это первый результат в Google, но у него нет удовлетворительного ответа. Есть два хороших способа сделать это, о которых я знаю. Во-первых, это проверка правильности, если запрос попадет в файл, и применит только условие перезаписи, если нет. Например.
server {
# ...
if (!-f $request_filename) {
rewrite [^/]$ $uri/ permanent;
}
location / {
# CMS logic, e.g. try_files $uri $uri /index.php$request_uri;
}
# ...
}
Второе, что многие предпочитают, поскольку они предпочитают избегать использования, если это не на 100% необходимо, - это использовать try_files для отправки запроса в именованный блок местоположения, когда он не попадет в файл. Например.
server {
# ...
location / {
try_files $uri $uri/ @cms;
}
location @cms {
rewrite [^/]$ $uri/ permanent;
# CMS logic, e.g. rewrite ^ /index.php$request_uri;
}
# ...
}
Ответ 8
Попробуйте следующее: ^(.*)$ http://domain.com/$1/ [L,R=301]
Это перенаправляет (код состояния 301) все ($ 1) без "/" до "$ 1/"