Comment Apache peut-il réécrire des URL sans que mod_rewrite ne soit activé ou configuré?
Je travaille sur une refonte de site à partir de mon serveur de développement. J’utilisais une structure de répertoires pour les sections de site, mais j’envisage de passer à la réécriture d’URL et de placer des fichiers associés dans la racine du site.
Par exemple, la sous-page about contient un sous-répertoire nommé about qui contient un index.php qui est servi lorsque la demande est http://www.example.com/about . Je prévois de changer cela pour que about.php du répertoire racine du site soit servi même si la requête n’inclut pas l’extension php.
Sur mon serveur de développement, le problème est que les URL sont déjà réécrites même si je n’ai pas de fichier .htaccess
dans la hiérarchie des chemins.
La configuration d’Apache est la configuration de base d’Ubuntu et je soupçonne que c’est quelque chose d’unique à Ubuntu, mais je ne peux pas trouver la cause.
Voici quelques observations que j’ai faites:
LogWarning
pour déboguer. Lorsque j’accède à une page sans l’extension .php, le journal des erreurs affiche l’URL avec l’extension et le journal des access le montre sans l’extension et un statut HTTP 200. La page est servie correctement. .htaccess
avec la configuration appropriée, j’obtiens une erreur .htaccess: Invalid command 'RewriteEngine'
. … mod_rewrite n’a même pas été chargé par défaut. access.log montre:
127.0.0.1 - - [16/Jan/2012:05:36:35 +0800] "GET /dev/ghodmode.com/h5bp/ HTTP/1.1" 200 3602 "http://alienware/dev/ghodmode.com/h5bp/experiments" "Mozilla/5.0 (Ubuntu; X11; Linux x86_64; rv:8.0) Gecko/20100101 Firefox/8.0"
tandis que error.log montre:
[Mon Jan 16 05:23:23 2012] [debug] mod_deflate.c(615): [client 127.0.0.1] Zlib: Compressed 5347 to 1876 : URL /dev/ghodmode.com/h5bp/experiments.php, referer: http://alienware/dev/ghodmode.com/h5bp/
Si j’ajoute un fichier .htaccess
:
[Mon Jan 16 05:34:33 2012] [alert] [client 127.0.0.1] /var/www/dev/ghodmode.com/h5bp/.htaccess: Invalid command 'RewriteEngine', perhaps misspelled or defined by a module not included in the server configuration, referer: http://alienware/dev/ghodmode.com/h5bp/experiments
Grâce aux réponses fournies, j’ai lu et j’ai appris quelques choses. L’essentiel est que j’utilise une installation Ubuntu d’Apache2 et que je n’ai modifié aucun paramètre de configuration par défaut. Ainsi, aucune des causes suggérées n’est définie.
Bien sûr, il y a une chance que j’ai mal compris une partie de la documentation. C’est la première fois que je lis certaines de ces options.
Multiviews
Multiviews fournit la meilleure explication de ce scénario, mais nécessite un mappage de type ou une option MultiViews
pour un chemin. Je n’ai qu’un seul type de mappage (/etc/apache2/mods-enabled/mime.conf) pour ‘var’ et l’option MultiViews
est uniquement définie pour / usr / share / apache2 / icons. Donc, ça ne pouvait pas être ça.
Redirect et RedirectMatch
Redirect & RedirectMatch fournirait une bonne explication pour ce comportement, mais il nécessite une directive pour chaque redirection. Je n’ai aucun de ces ensembles et aucun chemin que je tape ne sert le fichier php associé s’il existe. De plus, si c’était la cause, je pense que le fichier access.log génèrerait un statut 3xx au lieu de 200 s’il s’agissait d’une redirection.
Alias & AliasMatch
Alias & AliasMatch , tout comme Redirect & RedirectMatch, nécessite de définir une directive pour chaque ressource. Je n’ai qu’un alias défini pour / icons /.
FallbackResource
FallbackResource identifie une ressource unique à servir lorsque la ressource demandée n’est pas présente. Dans mon cas, lorsque la ressource demandée n’est pas présente, elle sert la ressource trouvée en ajoutant «.php» à la fin de la demande. J’ai également vérifié deux fois et il n’y a pas de directives FallbackResource définies.
Voici un exemple de la commande que j’utilise pour confirmer qu’une option particulière n’est pas définie:
find /etc/apache2 -name "*.conf" -exec grep -li "FallbackResource" {} \;
Il y avait un trou dans ma recherche de l’option MultiViews. Je cherchais uniquement des fichiers avec une extension .conf ou .load, mais certains fichiers de configuration ne possèdent aucune extension. L’option MultiViews est définie par le fichier de configuration de site par défaut / etc / apache2 / sites-enabled / 000-default.
Merci à @zneak d’avoir fourni la réponse en premier, bien qu’il l’ait fait dans un commentaire. Et merci à @regilero qui m’a montré indirectement ce qui me manquait en utilisant une syntaxe différente pour grep
de la syntaxe à laquelle je suis habitué.
Ce que vous appelez une réécriture peut être fait par beaucoup d’autres instructions:
Ces éléments de configuration ne sont généralement pas présents dans les fichiers .htaccess par défaut, car les fichiers .htaccess ne sont qu’une mauvaise chose qui ralentissent Apache et permettent à l’utilisateur d’append d’autres règles que celles définies dans VirtualHosts. Les éléments de configuration les plus utiles se trouvent dans /etc/apache2/sites-enabled
, /etc/apaches2/mod-enableds/
et /etc/apache2/conf.d/
.
Maintenant, le plus étrange est Option Multiviews
fait un grep -R MultiViews /etc/apache2/*
. Cette option mappe tout appel à http://www.example.com/foo/bar sur foo / bar.php ou foo / bar.html si ces répertoires existent dans DocumentRoot et si ces fichiers existent (en essayant toutes les extensions disponibles). ).