Apache2 - 301 Rediriger lorsqu'il manque «/» à la fin du répertoire dans l'url

13

Je n'ai pas vraiment remarqué cette redirection (301) lors de la demande d'une URL comme celle-ci sans barre oblique ("/") à la fin: http://server/directory

Le serveur répondra avec un en-tête permanent de redirection 301 avec un en-tête de localisation localisant http://server/directory/.

Voir cet exemple en direct:

Demande de l'utilisateur:

GET /social HTTP/1.1
( http://192.168.1.111/social )

Réaction du serveur Apache:

HTTP/1.1 301 Moved Permanently
Location: http://192.168.1.111/social/

Demande de l'utilisateur:

GET /social/ HTTP/1.1
( http://192.168.1.111/social/ )

Réaction du serveur Apache:

HTTP/1.1 200 OK

Apache access.log:

192.168.1.130 - - [05/Apr/2014:22:06:47 +0200] "GET /social HTTP/1.1" 301 558 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:27.0) Gecko/20100101 Firefox/27.0"
-
192.168.1.130 - - [05/Apr/2014:22:06:47 +0200] "GET /social/ HTTP/1.1" 200 942 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:27.0) Gecko/20100101 Firefox/27.0"

Le répertoire / social / contient un index.htmlfichier.

Logiciel Apache: Apache/2.2.22 (Ubuntu)
Options de répertoire:Options Indexes FollowSymLinks MultiViews

Alors, ma question est: pourquoi Apache fait ça? Et comment empêcher la redirection et envoyer le index.htmldirectement? Les clients doivent envoyer deux demandes, ce qui est vraiment inutile. Et peut-être que certains clients n'autorisent pas les redirections et ne pourront pas accéder au site sans la barre oblique de fin ("/").

Je ne veux pas désactiver la redirection. Je ne veux pas que le serveur envoie la réponse directement sans aucune redirection. Même lors d'une demande /social.

Apache est-il conçu pour rediriger ces demandes? Le serveur pourrait simplement envoyer les données sans redirection, non? Dois-je utiliser le mod_rewritepour éviter cela? Ou une autre configuration? Ou devrais-je simplement le laisser comme ça et ajouter une barre oblique à la fin de tous les liens html et vivre avec des redirections?

Qu'en pensez-vous?

Jonathan Gurebo
la source
Je pense que vous devrez clarifier pourquoi vous souhaitez désactiver cela. La seule alternative sensée à la redirection serait de répondre avec 404 pour /socialdans votre exemple.
Håkan Lindqvist
Je ne veux pas le désactiver, juste empêcher la redirection. Je voudrais que le serveur génère le index.htmlsans redirection
Jonathan Gurebo
Par "ceci", je faisais référence au comportement normal avec une redirection de l'URL incorrecte vers l'URL correcte. Voir la réponse de @kasperd pour certaines des raisons pour lesquelles ce serait une mauvaise idée de servir le contenu par exemple /social. (En outre, juste en général, servir le même contenu à plusieurs URL n'est généralement pas souhaité.)
Håkan Lindqvist

Réponses:

10

L'envoi des données sans redirection romprait les liens relatifs. Si http://server/directorycontient file, alors l'URL complète serait http://server/directory/file. Un lien spécifié comme <a href="file">indiquera http://server/directory/filesi l'URL de base l'est http://server/directory/, mais si l'URL de base était la seule, http://server/directoryelle pointerait à la http://server/fileplace, ce qui n'est pas le résultat souhaité.

Apache aurait pu générer la liste des répertoires de deux manières différentes selon l'URL au lieu de la rediriger. Cependant, cela ne fonctionnerait pas s'il y avait un index.htmlfichier dans le répertoire. Donc, à la place, Apache utilise l'approche, qui fonctionne dans les deux cas.

Ce n'est pas un nouveau comportement, il y a une décennie, Apache se comportait de la même manière. Les clients qui ne peuvent pas gérer une redirection auraient dû être corrigés maintenant. Mais pour tous les clients qui ne peuvent pas gérer une redirection, Apache devrait envoyer un petit fichier html avec un lien qui peut être suivi à la place.

kasperd
la source
Cela ne répond pas à la question. Il est vrai que les liens relatifs peuvent être rompus. Mais si quelqu'un veut fournir du contenu pour un chemin sans barre oblique de fin, il peut avoir des raisons pour cela, par exemple lorsqu'une demande POST est envoyée à un webservice. Il n'y a aucun lien relatif dans les services Web, et une redirection entraînera la perte du corps du POST.
dr fu manchu
9

mod_dirajoute cette redirection, et vous pouvez la désactiver avec une DirectorySlash Offdirective.

Notez cependant que la désactivation de la redirection de barre oblique de fin peut entraîner la rupture de certaines pages. Si la page renvoyée contient des liens relatifs, ces URL se résoudraient différemment si la page était diffusée sans la barre oblique de fin.

200_success
la source