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.html
fichier.
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.html
directement? 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_rewrite
pour é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?
/social
dans votre exemple.index.html
sans redirection/social
. (En outre, juste en général, servir le même contenu à plusieurs URL n'est généralement pas souhaité.)Réponses:
L'envoi des données sans redirection romprait les liens relatifs. Si
http://server/directory
contientfile
, alors l'URL complète seraithttp://server/directory/file
. Un lien spécifié comme<a href="file">
indiquerahttp://server/directory/file
si l'URL de base l'esthttp://server/directory/
, mais si l'URL de base était la seule,http://server/directory
elle pointerait à lahttp://server/file
place, 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.html
fichier 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.
la source
mod_dir
ajoute cette redirection, et vous pouvez la désactiver avec uneDirectorySlash Off
directive.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.
la source