Réécriture d’Apache sans mod_rewrite?

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:

  • /etc/apache2/httpd.conf est vide, mais la configuration se trouve dans /etc/apache2/apache2.conf, qui à son tour inclut des fichiers de configuration provenant de quelques autres répertoires.
  • Il n’y avait pas de fichiers .htaccess dans la hiérarchie de ce site. J’ai vérifié tous les répertoires à partir de / var / www
  • Aucun fichier .conf ou .load sous / etc / apache2 n’a de référence pour réécrire autre que le fichier rewrite.load dans / etc / apache2 / mods-available.
  • J’ai défini la directive 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.
  • Si j’ajoute un fichier .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.
  • Si j’active mod_rewrite en liant le fichier de chargement dans / etc / apache2 / mods-enabled, cela fonctionne comme prévu, c’est-à-dire exactement comme si je ne l’avais pas activé.

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 

Mettre à jour

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" {} \; 

Mise à jour n ° 2:

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:

  • Redirect & RedirectMatch : pour la redirection externe (avec 301,302 voire 403 ou 404 codes)
  • Alias ​​& AliasMatch : pour la redirection interne (redissortingbution interne des répertoires par exemple)
  • FallBackresource : pour redirect tous les fichiers manquants vers un index.php boostrap
  • Option Multiviews : depuis mod-autoindex qui est activé par défaut sur de nombreuses installations

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). ).