Je voudrais que les URL suivantes sur mon site soient équivalentes:
/foo/bar
/foo/bar/
/foo/bar/index.html
et en outre, je voudrais que les deux seconds formulaires émettent des redirections HTTP 301 vers le premier formulaire. Je ne sers que des pages statiques, et elles sont organisées selon le troisième formulaire. (En d'autres termes, lorsqu'un utilisateur demande, /foo/bar
il doit recevoir le fichier à l'adresse /usr/share/.../foo/bar/index.html
).
Mon nginx.conf
contient actuellement les éléments suivants:
rewrite ^(.+)/$ $1 permanent;
index index.html;
try_files $uri $uri/index.html =404;
Cela fonctionne pour les demandes de /foo/bar/index.html
, mais lorsque je demande /foo/bar
ou que /foo/bar/
Safari me dit que «trop de redirections se sont produites» - je suppose qu'il y a une boucle de redirection infinie ou quelque chose comme ça. Comment puis-je demander à nginx de mapper des URL à des fichiers comme je l'ai décrit?
Edit: Ma configuration complète
Voici mon tout nginx.conf
avec mon nom de domaine remplacé par "example.com".
user www-data;
worker_processes 1;
pid /run/nginx.pid;
events {
worker_connections 768;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
server_tokens off;
server_names_hash_bucket_size 64;
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss application/atom+xml text/javascript image/svg+xml;
server {
server_name www.example.com;
listen 80;
return 301 $scheme://example.com$request_uri;
}
server {
server_name example.com 123.45.67.89 localhost;
listen 80 default_server;
# Redirect /foobar/ to /foobar
rewrite ^(.+)/$ $1 permanent;
root /usr/share/nginx/www/example.com;
index index.html;
try_files $uri $uri/index.html =404;
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
}
/foo/bar/index.html
doivent renvoyer le fichier à/usr/share/nginx/www/foo/bar/index.html
ou quelle que soit sa configuration. Tous les chemins du site Web correspondent directement aux chemins du système de fichiers.Réponses:
Avoir cette expression régulière sur votre
server
bloc:redirigerait toutes les URL de barre oblique finale vers la barre oblique non finale respective.
la source
J'ai pu obtenir mon comportement souhaité en l'utilisant comme
server
bloc final dans ma configuration:la source
/index.html
URL reçoit une réponse avec HTTP 200 au lieu d'une redirection; les lignes de "réécriture" sont ignorées. Est-ce toujours d'actualité?N'utilisez jamais la réécriture:
la source
rewrite ^(.+)/+$ $1 permanent;
rewrite
peut être mauvais. Cela étant dit, la réponse fournie capture et correspond également à l'URI, je ne sais pas si cela améliorera les performances, il doit être testé. Utilisez(?<no_slash>.+)/$
plutôt cette expression régulière pour ne pas rediriger la page d'accueil.Cette règle prendra en charge n'importe quel nombre de barres obliques de fin et conservera l'URL. Il prendra également en charge les barres obliques de fin des URL de base
la source