mod_rewrite: pourquoi ça marche localement et pas en ligne?
-
03-07-2019 - |
Question
Je développe une application localement (sous Nom de domaine < mydomain > .dev ).
Afin de travailler avec des URL conviviales, j'ai configuré mon fichier .htaccess comme suit:
RewriteEngine on
# Externally redirect to add missing trailing slash
RewriteRule ^(([a-z0-9._\-]+/)*[a-z0-9_\-]+)$ http://example.com/$1/?%{QUERY_STRING}[NC,R,L]
RewriteRule ^about/$ about.php [NC,L]
RewriteRule ^issues/$ issues.php [NC,L]
RewriteRule ^issue/([a-z0-9_\-]+)/$ issue.php?slug=$1 [NC,L]
SetEnv PHP_VER 5
IndexIgnore *
Options +FollowSymLinks
Cela fonctionne bien. Chose embarrassante, quand on va en ligne, ce n’est pas si génial:
http://example.com/issue/my-slug/#23 ne renvoie aucune variable GET. Pourquoi?
La solution
Je suppose que, d'après l'expérience passée, c'est RewriteBase, probablement parce que vous vous trouvez sur un serveur partagé ou sous une autre configuration non standard.
RewriteEngine on
#Set base as doc root.
RewriteBase /
# Externally redirect to add missing trailing slash
RewriteRule ^(([a-z0-9._\-]+/)*[a-z0-9_\-]+)$ http://mydomain.eu/$1/?%{QUERY_STRING}[NC,R,L]
RewriteRule ^about/$ about.php [NC,L]
RewriteRule ^issues/$ issues.php [NC,L]
RewriteRule ^issue/([a-z0-9_\-]+)/$ issue.php?slug=$1 [NC,L]
SetEnv PHP_VER 5
IndexIgnore *
Options +FollowSymLinks
Autres conseils
Je ne vois pas que
RewriteRule ^(([a-z0-9._\-]+/)*[a-z0-9_\-]+)$ http://mydomain.eu/$1/?%{QUERY_STRING}[NC,R,L]
devrait correspondre à cette URL, mais c’est le seul avec le drapeau [R] pour faire une redirection externe. Essayez de commenter cette ligne pour vous assurer qu’aucune autre partie de votre application n’effectue la redirection. À mon avis, il y en a une.
Il manque un espace entre l'URL de substitution et les indicateurs. Vous pouvez également simplifier votre première règle comme suit:
RewriteRule ^([a-z0-9._-]+/)*[a-z0-9_-]+$ %{REQUEST_URI}/ [NC,R=301,L]