2009-10-28 10 views
0

Ceci est un problème très étrange, et j'espère juste que je peux l'expliquer clairement.htaccess réécriture ne fonctionne pas pour toutes les règles

En fait, nous avons fait une mise à jour majeure sur un site client aujourd'hui et nécessaire pour mettre à jour des règles de réécriture dans le htaccess pour accueillir la nouvelle structure, etc ...

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

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

nous avons changé à:

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

Mais quand nous avons visité http://www.example.com/media - il déployait l'ancienne page des médias. Ensuite, lorsque nous avons supprimé l'ancien media.php de la racine du document, nous avons obtenu 404s. Quelque part quelque part est toujours mapping/media à media.php - et ignore la règle de réécriture. La chose étrange est - toutes les autres règles de réécriture dans le fichier fonctionnent bien - et il y en a environ 20 là-dedans.

Nous avons suivi les fichiers vhost et autres fichiers de configuration, mais nous ne trouvons aucune référence aux médias ou aux autres redirections cassées (trois au total) - nous sommes donc perplexes.

+0

Avez-vous redémarré le serveur Web? – Gumbo

+0

oui, nous l'avons fait - bien que cela ne devrait normalement pas affecter le niveau de répertoire htaccess (et pas) – HorusKol

+0

Mais lors de l'utilisation de mod_rewrite dans un fichier .htaccess, le préfixe de chemin par répertoire est supprimé de l'URI de la requête. être retiré du motif. Les règles données ne devraient donc pas fonctionner du tout dans un fichier .htaccess. – Gumbo

Répondre

1

La désactivation de l'option MultiViews du site .htaccess a résolu le problème - il semblait que cela permettait la négociation de contenu qui était en cours de traitement avant les règles de réécriture.

2

Je soupçonne fortement que cela serait dû à AcceptPathInfo, qui à mon avis est une mauvaise fonctionnalité Apache. Par défaut je crois qu'il est allumé là où PHP est le gestionnaire.

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

AcceptPathInfo Off 

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

-

Quelques points latéraux:

Vous devez vous assurer que vos RewriteRules se terminent toujours par [L] lorsque vous avez trouvé une correspondance - cela facilitera le débogage. E.g .:

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

De même, vous pouvez 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 moitié n'est pas bon, car cela signifie que les deux URL fonctionnent, sans redirection, ce qui signifie que vous n'en avez pas un qui est «correct». Personnellement, j'utiliser:

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

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

+0

Quelques bons points là-bas - malheureusement, c'est un site ancien, et jusqu'ici j'ai suivi le schéma tel que décrit par les développeurs précédents (suivant l'approche "il n'est pas encore assez cassé pour justifier une fixation"). Il se trouve, cependant, que le problème était MultiViews étant activé ... maintenant je dois savoir s'il est «sûr» de le désactiver. – HorusKol

Questions connexes