Comment empêcher Apache / mod_rewrite de traiter le chemin comme un fichier avec le même nom

J’utilise WAMP Server, principalement configuré tel quel. J’ai du mal à faire en sorte que mod_rewrite se comporte comme prévu localement (tout fonctionne correctement sur un serveur de production).

J’ai un fichier PHP situé à: /ajax/graphs/get-graph.php

La manière dont ce fichier est normalement appelé est via un fichier bootstrap chargé par /index.php

J’ai un fichier .htaccess à la racine avec les règles suivantes:

 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /index.php [L] 

Donc, fondamentalement, lorsque mon application demande via AJAX un appel à /ajax/graphs/get-graph/ il devrait être dirigé vers /index.php .

Le problème est que Apache / mod_rewrite voit le chemin de la requête et charge directement /ajax/graphs/get-graph.php .

Comment puis-je empêcher Apache de supposer que /ajax/graphs/get-graph/ est un fichier valide car un fichier php du même nom existe à cet emplacement?

On dirait que vous êtes tombé dans le piège de la négociation de contenu 😉 Comme expliqué dans la documentation Apache , il existe une option appelée MultiViews qui, une fois activée, amène Apache à convertir les noms de répertoires inexistants en noms de fichiers correspondants.

L’effet de MultiViews est le suivant: si le serveur reçoit une requête pour /some/dir/foo , si /some/dir a activé MultiViews et /some/dir/foo n’existe pas, le serveur lit le répertoire à la recherche de fichiers nommés foo.* , et falsifie efficacement une carte de type qui nomme tous ces fichiers …

L’intention est que vous pouvez avoir plusieurs versions d’un fichier dans différents formats ou langues, comme

 /some/dir - foo.en.gif - foo.en.png - foo.en.jpg - foo.fr.gif - foo.fr.png - foo.fr.jpg 

et Apache choisira la meilleure en fonction des préférences fournies par le navigateur.

Pour y remédier, il vous suffit d’append la directive

 Options -MultiViews 

dans un bloc ou correspondant à /ajax/graphs . Ou, si vous n’avez pas access à la configuration du serveur principal, vous pouvez la placer dans /ajax/graphs/.htaccess .