10
votes

Apache DirectorySlash Off - Sites Pause

Si je définis DirectorySlash désactivé dans mon .htaccess et appelez le répertoire sans la barre oblique de fuite, je reçois un 403- Interdit de mon serveur. Si je l'appelle avec Slash, tout fonctionne bien.

Quelqu'un pourrait-il expliquer pourquoi? Voici mon .htaccess : xxx


0 commentaires

4 Réponses :


2
votes

Je pense que parce que lorsque vous désactivez la déglayage des répertoires, il désactive l'autocorrection de l'URL et tente d'afficher la liste de répertoires, mais heureusement, vous avez probablement hérité de cela quelque part (ou dans les autorisations de fichier) afin qu'il envoie un 403-interdit. Je suppose que lorsque vous allumez-le, cela fonctionne normalement. D'après ce que je comprends de la documentation, il n'est pas très bon d'utiliser les répertoires de répertoires pour la sécurité. http://httpd.apache.org/docs/2.1/mod/mod_dir. HTML


3 commentaires

Laurent, merci pour votre réponse. J'ai lu l'avertissement de sécurité dans les documents Apache, mais j'ai besoin de comprendre ce qui s'est mal passé ici. À la manière dont la liste des répertoires est par défaut désactivé à mon backend WebHost.


Vous rewritebase est / dossier / Vous avez donc besoin de la barre oblique de fin de l'URL pour correspondre. Vous pouvez la définir sur / dossier et je pense que cela devrait fonctionner sans la barre oblique finale.


Je reçois aussi un 403 si je suis votre suggestion.



16
votes

Comme vous le savez par la documentation, lorsque DirectorySlash est défini sur OFF , Demandes to / Dossier N'A PAS DIGLAGEINDEX < / code> évalué. Cela signifie que la demande ne sera pas automatiquement mappée sur /folder/index.php .

mod_dir exécute cette vérification de la phase "Fixup" du traitement de la demande. mod_rewrite , qui est responsable de vos définitions Rewriterule , exécute également son traitement dans cette phase lorsque vous spécifiez les règles dans un fichier .htaccess . < / p>

Cependant, il a été programmé avec une prise de conscience des modules tels que mod_dir et inclut un chèque pour vous assurer que le répertoire actuel a été demandé avec une barre oblique de fuite. Sinon, il décline de gérer la demande, car cela pourrait entraîner un comportement indéfini.

La requête passe ensuite à la phase de génération de contenu, qui, étant donné que la demande n'a pas été mappée sur un fichier réel. , est géré par mod_autoindex . Étant donné que index est désactivé sur votre hôte par défaut, mod_autoindex renvoie 403 interdit qui est ce que vous voyez.

note que depuis DirectoryIndex n'est pas évalué, même si mod_rewrite était pour traiter la demande, il échouerait toujours, car aucune résolution automatique, car aucune résolution auto > index.php se produirait et votre règle xxx

ne correspondrait pas, car le . nécessite une correspondance sur quelque chose ( mais la demande serait vide).

Activation de DirectorySlash Empêche ce scénario en corrigeant les actions évitées dans tous les scénarios mentionnés précédemment, à l'exception de la dernière note, qui est prise en charge par Le fait que DirectoryIndex mappe la requête sur index.php de toute façon.


2 commentaires

Merci beaucoup! Facile à comprendre aussi, si j'ai lu votre réponse.


Mais que si nous voulons obscurcir notre structure de répertoire et utiliser toujours mod_rewrite pour chaque demande? Disons que j'ai un site avec un répertoire / privé . Apache me redirigerait vers / privé / Si je demande / privé si répertoiresLash est sur , laissant ainsi la divulgation de l'information Prendre. Et si je veux juste envoyer / privé à mon index.php contrôleur avant?



9
votes

avec Apache 2.4 Vous pouvez autoriser des réécroissements dans les fichiers .htaccess en définissant réécritoption allownoslash . xxx

voir Documentation Apache de mod_rewrite


0 commentaires

0
votes

Comme Tom déjà répondu, il existe une option spéciale pour réécritoptions, mais uniquement pour Apache 2.3.16+, donc si vous, comme moi, avez une amache de la version plus ancienne, vous ne pouvez pas réécrire l'URL pour le même répertoire, car Apache Ne sait pas sur ce répertoire.

Exemple: "Obtenir / Somedir" pointera sur code> dans Rewrite Log , mais (!) Nom de fichier demandé (% F) dans le journal d'accès sera toujours / var / www / html / public / somedir / code > - Ceci est une logique Crazy Apache. Et Apache vous montrera 503 (sans options + index) ou une liste de répertoires (sinon) avec de mauvaises URL telles que / SubDir / au lieu de / SOMEDIR / SUBDIRE / P>

Ainsi, j'ai trouvé un seul Solution pour moi - Utilisation des alias: P>

AliasMatch "/somedir$" "/var/www/html/public/somedir/index.html"


0 commentaires