url - una - redirectmatch 301
Nginx causa la redirección 301 si no hay una barra inclinada (4)
Intenta cambiar
server_name localhost;
# server_name_in_redirect off;
a
server_name localhost:8080;
server_name_in_redirect on;
Estoy ejecutando nginx en una máquina virtual usando NAT y tengo problemas de redirección cuando accedo desde la máquina host.
Funciona como se esperaba
-
http://localhost:8080/test/index.htm
: funciona. -
http://localhost:8080/test/
: funciona.
No funciona como se esperaba
-
http://localhost:8080/test
: redirige ahttp://localhost/test/
. Esto no es lo que quiero
Lo que he intentado
Basado en lo que he buscado en Google, intenté server_name_in_redirect off;
y rewrite ^([^.]*[^/])$ $1/ permanent;
, ambos sin éxito.
Mi 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;
}
}
Una solución algo más simple, que funcionó para mí, es desactivar las redirecciones absolute_redirect off;
con absolute_redirect off;
como en el siguiente ejemplo:
server {
listen 80;
server_name localhost;
absolute_redirect off;
location /foo/ {
proxy_pass http://bar/;
}
Si ejecuto curl on en http://localhost:8080/foo
, puedo ver que el encabezado Location
en la respuesta HTTP redirigida se da como /foo/
y no 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/
A partir de eso, supongo que cualquier navegador web haría lo correcto con la ubicación relativa. Probado en Chrome y funciona bien.
tratar :
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;
}
}
}
serverfault una posible solución a este problema en serverfault ; reproducido aquí por conveniencia:
Si entiendo la pregunta correctamente, quiere que se publique automáticamente, sin usar un redireccionamiento 301, http://example.com/foo/index.html cuando la solicitud es para http://example.com/foo sin barra posterior ?
Solución básica que funciona para mí
Si es así, he encontrado que esta configuración try_files funciona:
try_files $uri $uri/index.html $uri/ =404;
- El primer
$uri
coincide exactamente con el uri - El segundo
$uri/index.html
coincide con un directorio que contiene el index.html donde el último elemento de la ruta coincide con el nombre del directorio, sin barra inclinada - El tercer
$uri/
coincide con el directorio - El cuarto
=404
devuelve la página de error 404 si ninguno de los patrones anteriores coincide.
Mi versión actualizada
Si agrega en el bloque de server
:
index index.html index.htm;
Y modifique try_files
para que se vea así:
try_files $uri $uri/ =404;
Debería funcionar también.