Подтвердить что ты не робот

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

4b9b3361

Ответ 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/"