Nginx добавляет завершающий слеш без перезаписи

Nginx добавляет завершающий слеш без перезаписи

Я пытаюсь создать перенаправление, чтобы добавить завершающий слеш,

location / {
  if($request_uri ~ ^([^.]*[^/])$){
    return 301 https://$host$request_uri/;
  }
}

Я понятия не имею, как сделать сопоставление в if, когда я просто создаю перенаправление с помощью / - это работает, просто это регулярное выражение кажется сломанным.

ОБНОВЛЯТЬ

Переписать я попробовал

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

и

if ($http_x_forwarded_proto != "https") {
  return 301 https://$host$request_uri;
}

работает отлично, перенаправляет на https, я хотел создать регулярное выражение с ним

решение1

Проблема решена давно, но я вижу, что многие проверяют этот вопрос, так что, если я правильно помню, у меня не было этой строки кода, и она перенаправляла меня:

port_in_redirect off;

Я знаю, я не упомянул порты, о которых идет речь, на это невозможно ответить, но я просто оставлю это здесь, если у кого-то возникнет такая же проблема.

решение2

Если я правильно понял вопрос, вы хотите автоматически обслуживать, без использования 301-редирект,http://example.com/foo/index.htmlкогда запрос касаетсяhttp://example.com/fooбез завершающего слеша?

Если так, то я обнаружил, что эта конфигурация try_files работает:

try_files $uri $uri/index.html $uri/ =404;
  • Первый $uriточно соответствует URI
  • Второй $uri/index.htmlсоответствует каталогу, содержащему index.html, где последний элемент пути соответствует имени каталога, без завершающего слеша.
  • Третий $uri/соответствует каталогу
  • Четвертый =404возвращает страницу ошибки 404, если ни один из предыдущих шаблонов не соответствует.

решение3

Кажется, это работает так, как и ожидалось:

location / {
    if ($request_uri ~ ^([^.]*[^/])$) {
        return 301 https://$host$request_uri/;
    }
    try_files $uri $uri/ /index.html;
    ....
}

Не уверен, что вижу разницу с тем, который вы пробовали, за исключением синтаксической ошибки, с которой вы должны были столкнуться из-за пропущенных пробелов в операторе if(это может быть опечатка). ...или, может быть, потому, что у вас есть другие директивы, которые вы нам не показываете и которые переопределяют эту.

Связанный контент