Назад | Перейти на главную страницу

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

Я пытаюсь создать перенаправление, чтобы добавить косую черту в конце,

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

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

ОБНОВИТЬ

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

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

и

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

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

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

port_in_redirect off;

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

Если я правильно понял вопрос, вы хотите автоматически обслуживать без использования перенаправления 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, если ни один из предыдущих шаблонов не соответствует.

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

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

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