Добавьте косую черту в конце каждого URL (нужно переписать правило для nginx) - PullRequest
45 голосов
/ 14 марта 2009

Я пытаюсь получить "/" для каждого конца URL:

example.com / искусство

должен

example.com / искусство /

Я использую 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 для добавления слеша? (Я думаю, что я должен переписать правило?)

Ответы [ 9 ]

98 голосов
/ 12 октября 2010

Скорее всего, я думаю, вы хотели бы что-то вроде этого:

rewrite ^([^.]*[^/])$ $1/ permanent;

Регулярное выражение переводится как: msgstr "переписать все URI без '.' в тех, которые не заканчиваются символом '/' на URI + '/' " Или просто: «Если URI не имеет точки и не заканчивается косой чертой, добавьте косую черту в конец»

Причина только перезаписи URI без точек в них делает так, что любой файл с расширением файла не перезаписывается. Например, ваши изображения, css, javascript и т. Д. И предотвращение возможных циклов перенаправления при использовании некоторого php-фреймворка, который также выполняет свои собственные перезаписи

Еще одна распространенная перезапись, сопровождающая это:

rewrite ^([^.]*)$ /index.php;

Это очень просто переписывает все URI, у которых нет точек в них, в ваш index.php (или любой другой файл, из которого вы выполняете свой контроллер).

23 голосов
/ 20 мая 2013
rewrite ^([^.\?]*[^/])$ $1/ permanent;

чтобы избежать добавления / тегирования строк запроса для URL-адреса отдыха.

, например

/ myrest / делать? Д = 12345

8 голосов
/ 25 сентября 2010

Для nginx:

rewrite ^(.*[^/])$ $1/ permanent;
2 голосов
/ 12 декабря 2016

Странно, что это первый результат в 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;
   }
   # ...
}
1 голос
/ 24 июля 2015
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), чтобы сделать его более конкретным.

1 голос
/ 12 марта 2014

используя переписанные слова из anthonysomerset в Wordpress, я испытал проблемы с доступом к / wp-admin dashboard из-за петли переадресации. Но я решаю эту проблему, используя приведенное выше условие:

if ($request_uri !~ "^/wp-admin")
{
rewrite ^([^.]*[^/])$ $1/ permanent;
rewrite ^([^.]*)$ /index.php;
}
0 голосов
/ 16 марта 2018

Если nginx за прокси с https, этот фрагмент правильно перенаправляет для $scheme

map $http_x_forwarded_proto $upstream_scheme {
    "https" "https";
    default "http";
}

server {
    ...
    location / {
        rewrite ^([^.\?]*[^/])$ $upstream_scheme://$http_host$1/ permanent;
    }
    ...
}

И на восходящем прокси передайте заголовок X-Forwarded-Proto, например:

location / {
    proxy_set_header X-Forwarded-Proto $scheme;
    ...
}
0 голосов
/ 01 февраля 2016

слишком поздно, но я хочу поделиться своим решением, я столкнулся с проблемой с косой чертой и 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 / {
    ....
    }
}
0 голосов
/ 14 марта 2009

Попробуйте это: ^(.*)$ http://domain.com/$1/ [L,R=301]

Это перенаправляет (код состояния 301) все ($ 1) без "/" на "$ 1 /"

...