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?
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
.
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]