web-dev-qa-db-fra.com

Supprimer la barre oblique de fin et index.html dans .htaccess

Je semble être coincé ici en essayant de comprendre comment rediriger les scénarios suivants:

/foo/index.html    -> /foo (remove trailing slash, index.html as 301)
/foo/              -> /foo (remove trailing slash as 301)
/foo               -> No redirect, shows the file at /foo/index.html
/foo/notindex.html -> No redirect, shows the file at /foo/notindex.html

Je crois que les lignes pertinentes dans mon .htaccess sont

DirectorySlash Off
RewriteEngine On
RewriteBase /

# Redirect /foo/ to /foo
RewriteRule ^(.*)\/(\?.*)?$ $1$2 [R=301,L,E=LOOP:1]

# Redirect /foo to /foo/index.html
RewriteCond %{ENV:REDIRECT_LOOP} !1
RewriteRule ^(.*)(\?.*)?$ $1/index.html$2 [L]

# Redirect /foo/index.html to /foo
RewriteCond %{ENV:REDIRECT_LOOP} !1
RewriteRule ^(.*)\/index.html$ /$1 [R=301,L]

mais bien sûr, le contenu du fichier entier . htaccess pourrait être utile ici aussi. Qu'est-ce que je fais mal?

UPDATE 11/13/14

J'ai annulé toutes les règles ci-dessus et je recommence:

# Remove trailing slash
DirectorySlash Off
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}/index.html -f
RewriteRule ^(.*)$ /$1/index.html [L]

Cela satisfait 2 des 4 points. Pour être plus précis:

1 https://server.com/foo            renders the /foo/index.html correctly without redirect
2 https://server.com/foo/           renders the /foo/index.html correctly but should redirect to /foo instead of rendering
3 https://server.com/foo/index.html renders the /foo/index.html correctly but should redirect to /foo instead of rendering
4 https://server.com/foo/foo.html   renders the /foo/foo.html correctly

Alors, maintenant que les n ° 1 et n ° 4 sont corrects, comment puis-je ajouter des redirections 301 pour les n ° 2 et n ° 3 sans le casser ou le boucler?

1
coneybeare

Ce n'est pas exactement la réponse à votre question, mais vous devriez réfléchir à deux fois avant de supprimer les barres obliques finales des répertoires.

La documentation sur DirectorySlash met en garde contre des problèmes potentiels (un désordre avec les URL relatives et autres). Et vous pouvez éviter certains maux de tête en redirigeant uniquement avec une directive 301 /dir/index.html vers /dir/ (presque votre point 3) et en utilisant la directive DirectoryIndex index.html.

1
Zimmi

Vos deux dernières entrées ne s'annulent-elles pas? # Redirect /foo to /foo/index.html puis dans l'autre sens # Redirect /foo/index.html to /foo

Si ce n'est que pour ces fichiers individuels? Alors j'essayerais:

# 301 Redirect /foo/index.html to /foo
RewriteCond %{QUERY_STRING}  ^$
RewriteRule ^foo/index\.html$ /foo? [R=301,NE,NC,L]

# 301 Redirect /foo/ to /foo
RewriteCond %{QUERY_STRING}  ^$
RewriteRule ^foo/$ /foo? [R=301,NE,NC,L]

Si vous essayez de le faire pour plusieurs fichiers en une fois, essayez:

# 301 Redirect remove trailing index.html
RewriteCond %{THE_REQUEST} /index.html HTTP
RewriteRule (.*)index.html$ /$1 [R=301,L]

# 301 Redirect remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)$
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]

Vous pouvez également spécifier des répertoires spécifiques que vous ne souhaitez pas appliquer à cette règle:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !I-want-a-trailing-slash-on-this-one/(.*)$
RewriteCond %{REQUEST_URI} !(.*)$
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]
1
Max