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;
}
}
Ответы
Ответ 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;