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

Nginx вызывает 301 перенаправление, если нет косой черты

Я запускаю nginx на виртуальной машине с использованием NAT, и у меня возникают проблемы с перенаправлением при доступе к нему с хост-машины.

Работает как положено

  • http://localhost:8080/test/index.htm: работает.
  • http://localhost:8080/test/: работает.

Не работает, как ожидалось

  • http://localhost:8080/test: перенаправляет на http://localhost/test/. Это не, что я хочу.

Что я пробовал

Исходя из того, что я погуглил, я попробовал server_name_in_redirect off; и rewrite ^([^.]*[^/])$ $1/ permanent;, но оба безуспешно.

Мой default.conf:

server {
    listen       80;
    server_name  localhost;
    # server_name_in_redirect off;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm index.php;
    }

    location ~ \.php$ {
    # rewrite ^([^.]*[^/])$ $1/ permanent;
        root           /usr/share/nginx/html;
        try_files      $uri =404;
        #fastcgi_pass   127.0.0.1:9000;
        fastcgi_pass   unix:/tmp/php5-fpm.sock;
        fastcgi_index  index.php;
        include        fastcgi_params;
    }


    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

}
4b9b3361

Ответ 1

Я опубликовал возможное решение этой проблемы на serverfault; воспроизведено здесь для удобства:

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

Взято из ответа о сбое сервера

Моя обновленная версия

Если вы добавите в блок server:

index index.html index.htm;

И измените try_files, чтобы он выглядел так:

try_files $uri $uri/ =404;

Это тоже должно работать.

Ответ 2

Несколько более простое решение, которое сработало для меня, заключается в отключении абсолютных перенаправлений с помощью absolute_redirect off;, как в следующем примере:

server {
    listen 80;
    server_name  localhost;
    absolute_redirect off;

    location /foo/ {
        proxy_pass http://bar/;
    }

Если я запускаю curl на http://localhost:8080/foo, я вижу, что заголовок Location в ответе HTTP перенаправления задается как /foo/, а не http://localhost/foo/.

$ curl -I http://localhost:8080/foo
HTTP/1.1 301 Moved Permanently
Server: nginx/1.13.8
Date: Tue, 03 Apr 2018 20:13:28 GMT
Content-Type: text/html
Content-Length: 185
Connection: keep-alive
Location: /foo/

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

Ответ 3

попробуйте:

server {
    listen       80;
    server_name  localhost;
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm index.php;
        if (-d $request_filename) {
            rewrite [^/]$ $scheme://$http_host$uri/ permanent;
        }
    }
}

Ответ 4

Попробуйте изменить

server_name  localhost;
# server_name_in_redirect off;

к

server_name  localhost:8080;
server_name_in_redirect on;