4 votes

DirectoryIndex ne fonctionne pas correctement pour l'URL réécrite

J'ai domain.com et sub.domain.com pointant vers le même serveur et j'utilise mod_rewrite pour réécrire les URLs pour sub.domain.com vers le sous-répertoire sub. J'ai le fichier .htaccess suivant dans la racine du document :

DirectoryIndex index.html index.php

# Empêche la boucle de réécriture infinie.
RewriteCond %{ENV:REDIRECT_STATUS} ^$
# Envoie toutes les requêtes adressant sub.domain.com...
RewriteCond %{HTTP_HOST} =sub.domain.com [NC]
# ...vers le répertoire /sub.
RewriteRule ^ /sub%{REQUEST_URI} [QSA]

Dans le répertoire sub j'ai index.php et pas de index.html, mais les requêtes vers http://sub.domain.com semblent ignorer complètement index.php et renvoyer une erreur 404. Cependant, si j'ai index.html là-bas, c'est servi. La seule façon d'obtenir que index.php soit servi est de définir

DirectoryIndex index.php

mais ce n'est pas quelque chose que je veux faire pour l'ensemble du site.

Curieusement, les URLs autres que la racine du document présentent un comportement normal de DirectoryIndex. Par exemple, http://sub.domain.com/search essaie de trouver sub/search/index.html puis sub/search/index.php avant de renvoyer une erreur 404.

Si je fais une requête vers le répertoire sub à partir du domaine parent http://domain.com/sub, je peux voir index.php, ce qui me laisse complètement perplexe face au problème.

Je voudrais inclure le journal d'erreurs d'Apache, mais j'utilise un hébergement partagé et je n'ai pas de moyen d'augmenter la verbosité du journal. De plus, je n'ai pas pu reproduire cette erreur localement. Le serveur d'hébergement Web utilise Apache 2.4.3, et mon serveur local est Apache 2.4.9.

1 votes

Essayez d'ajouter DirectoryCheckHandler On à votre configuration apache? docs

0 votes

Désolé pour le retard. En regardant la documentation pour DirectoryCheckHandler, ils indiquent que "Les versions antérieures à 2.4 agissent implicitement comme si 'DirectoryCheckHandler ON' avait été spécifié." Mon serveur Apache local devrait avoir cette directive DÉSACTIVÉE par défaut, et je suppose que le serveur d'hébergement devrait l'avoir aussi DÉSACTIVÉE (car c'est une version 2.4). Si le comportement de DirectoryCheckHandler est la cause principale, ne devrais-je pas le voir sur les deux serveurs?

0 votes

Et de toute façon, je ne pourrais pas définir DirectoryCheckHandler sur le serveur hébergé car il n'est pas disponible dans cette version.

2voto

howanghk Points 136

J'ai le même problème après avoir mis à niveau vers Ubuntu 14.04, qui comprend Apache 2.4.7.

Voici ma solution de contournement. Émuler mod_dir avec mod_rewrite, et désactiver DirectoryIndex.

#DirectoryIndex index.html index.php index.htm
DirectoryIndex disabled

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

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

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

J'espère que cela aide.


MISE À JOUR : La mise à niveau vers Apache 2.4.10 a résolu le problème pour moi.

Merci à Ondrej Surý cela peut être fait facilement sur Ubuntu 14.04 avec apt :

add-apt-repository ppa:ondrej/apache2
apt-get update
apt-get install apache2

p.s. L'OP a confirmé que cela était résolu dans Apache 2.4.9 aussi.

0 votes

J'ai finalement utilisé une solution de contournement presque identique. Merci de l'avoir postée!

0 votes

Aussi, j'ai opté pour cette solution de contournement pour une autre raison. Je voulais que les URL des répertoires n'aient pas de barres obliques (et les ai explicitement supprimées avec des redirections mod_rewrite). Mais parce que "DirectoryIndex ne sera évalué que pour les répertoires demandés avec une barre oblique finale", j'ai encore utilisé mod_rewrite pour émuler les index. Avec du recul, il aurait été beaucoup plus facile de garder les barres obliques finales :)

1voto

Jesse Kochis Points 470

Définissez la directive DirectoryCheckHandler sur ON.

Les documents d'Apache disent :

Disponible dans la version 2.4.8 et ultérieure. Les versions antérieures à 2.4 agissent implicitement comme si "DirectoryCheckHandler ON" était spécifié.

mod_dir effectuait toujours ses vérifications peu importe quelle gestionnaire était définie et maintenant il doit être activé explicitement lorsqu'on n'utilise pas le gestionnaire par défaut.

0 votes

Les déclarations mod_rewrite étaient en cours d'utilisation, ce qui empêchait DirectoryIndex d'être vérifié. Cela a été corrigé.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X