Question

C’est un problème très étrange, et j’espère seulement pouvoir l’expliquer clairement.

En gros, nous avons effectué une mise à jour majeure sur un site client aujourd’hui et nous avons dû mettre à jour certaines règles de réécriture dans htaccess afin de prendre en charge la nouvelle structure, etc.

Donc, là où nous avions à l'origine des choses comme:

RewriteRule ^/resources/?$  index.php?id=resources
RewriteRule ^/media/?$      media.php

Nous sommes passés à:

RewriteRule ^/resources/?$  index.php?id=resources
RewriteRule ^/media/?$      index.php?id=media

Mais lorsque nous avons visité http://www.example.com/media , il affichait l'ancienne page de média. Ensuite, lorsque nous avons supprimé l’ancien media.php de la racine du document, nous avons obtenu 404. Quelque chose continue à mapper / media vers media.php - et à ignorer la règle de réécriture.

Ce qui est étrange, c’est que toutes les autres règles de réécriture du fichier fonctionnent bien - et qu’il en existe une vingtaine environ.

Nous avons suivi les fichiers vhost et autres fichiers de configuration, mais nous ne trouvons aucune référence au média ni aux autres redirections interrompues (trois au total). Nous sommes donc bloqués.

Était-ce utile?

La solution 2

La désactivation de l'option MultiViews sur le site .htaccess a corrigé le problème. Il semblait que cela permettait d'activer la négociation de contenu en cours de traitement avant les règles de réécriture.

Autres conseils

Je soupçonne fortement que cela serait dû à AcceptPathInfo, qui, à mon avis, est une mauvaise fonctionnalité d'Apache. Par défaut, je pense qu’il est activé lorsque PHP est le gestionnaire.

Essayez d’ajouter à votre fichier .htaccess, ou de préférence votre fichier httpd.conf (et redémarrez-le):

AcceptPathInfo Off

Voir: http://httpd.apache.org/docs /2.2/mod/core.html#acceptpathinfo

-

Quelques points secondaires:

Vous devez vous assurer que vos règles Rewrite se terminent toujours par [L] lorsque vous avez trouvé une correspondance - cela facilitera le débogage. Exemple:

RewriteRule ^/media/?$      index.php?id=media [L]

Vous pouvez également réduire le nombre de règles en combinant des règles similaires. par exemple:

RewriteRule ^/(media|resources)/?$  index.php?id=$1 [L]

Personnellement, je pense que l’utilisation de /? à la fin de votre première mi-temps, ce n’est pas bon, parce que cela signifie que les deux URL fonctionnent, sans redirection, ce qui signifie que vous n’avez pas une adresse définitive qui est «correcte». Personnellement j'utiliserais:

RewriteRule ^/(media|resources)/$  index.php?id=$1 [L]
RewriteRule ^/(media|resources)$ /$1/ [L,R]

En d'autres termes, une ressource unique doit avoir une seule URL canonique (définitive).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top