J'exécute nginx dans une machine virtuelle en utilisant NAT et j'ai des problèmes de redirection lorsque j'y accède depuis la machine hôte.
http://localhost:8080/test/index.htm
: Fonctionne.http://localhost:8080/test/
: Fonctionne.http://localhost:8080/test
: Redirige vers http://localhost/test/
. C'est pas ce que je veux.Sur la base de ce que j'ai googlé, j'ai essayé server_name_in_redirect off;
Et rewrite ^([^.]*[^/])$ $1/ permanent;
, les deux sans succès.
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;
}
}
J'ai publié une solution possible à ce problème sur serverfault ; reproduit ici pour plus de commodité:
Si je comprends bien la question, vous souhaitez diffuser automatiquement, sans utiliser de redirection 301, http://example.com/foo/index.html lorsque la demande concerne http: //example.com/foo sans barre oblique de fin?
Si c'est le cas, j'ai trouvé que cette configuration try_files fonctionne:
try_files $uri $uri/index.html $uri/ =404;
$uri
correspond exactement à l'uri$uri/index.html
correspond à un répertoire contenant l'index.html où le dernier élément du chemin correspond au nom du répertoire, sans barre oblique de fin$uri/
correspond au répertoire=404
renvoie la page d'erreur 404 si aucun des modèles précédents ne correspond.Si vous ajoutez dans le bloc server
:
index index.html index.htm;
Et modifiez try_files
pour ressembler à ceci:
try_files $uri $uri/ =404;
Cela devrait aussi fonctionner.
Une solution un peu plus simple, qui a fonctionné pour moi, consiste à désactiver les redirections absolues avec absolute_redirect off;
comme dans l'exemple suivant:
server {
listen 80;
server_name localhost;
absolute_redirect off;
location /foo/ {
proxy_pass http://bar/;
}
Si je lance curl on sur http://localhost:8080/foo
, Je peux voir que l'en-tête Location
dans la réponse HTTP de redirection est donné comme /foo/
et pas 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/
De là, je suppose que n'importe quel navigateur Web ferait la bonne chose avec l'emplacement relatif. Testé sur Chrome et cela fonctionne très bien.
essayez:
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;
}
}
}
Essayez de changer
server_name localhost;
# server_name_in_redirect off;
à
server_name localhost:8080;
server_name_in_redirect on;