Apache2 - 301 Redirecionar quando estiver faltando "/" no final do diretório no URL

13

Eu realmente não notei esse redirecionamento (301) ao solicitar um URL como este sem barra ("/") no final: http://server/directory

O servidor receberá um cabeçalho 301 Redirect Permanent com um cabeçalho Location localizado http://server/directory/.

Veja este exemplo ao vivo:

Solicitação de usuário:

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

Servidor Apache Responda:

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

Solicitação de usuário:

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

Servidor Apache Responda:

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"

O diretório / social / contém um index.htmlarquivo.

Software Apache: Apache/2.2.22 (Ubuntu)
Opções de Diretório:Options Indexes FollowSymLinks MultiViews

Então, minha pergunta é: por que o apache está fazendo isso? E como impedir o redirecionamento e enviar index.htmldiretamente? Os clientes precisam enviar duas solicitações, o que é realmente desnecessário. E talvez alguns dos clientes não permitam redirecionamentos e não possam acessar o site sem a barra final ("/").

Não quero desativar o redirecionamento. Não quero que o servidor envie a resposta diretamente sem nenhum redirecionamento. Mesmo ao solicitar /social.

O apache foi projetado para redirecionar essas solicitações? O servidor poderia simplesmente enviar os dados sem redirecionar, certo? Devo usar o mod_rewritepara evitar isso? Ou outra configuração? Ou devo deixar assim e adicionar uma barra no final de todos os links html e viver com alguns redirecionamentos?

O que é que vocês acham?

Jonathan Gurebo
fonte
Acho que você terá que esclarecer por que deseja desativar isso. A única alternativa sã para o redirecionamento seria responder com 404 /socialno seu exemplo.
Håkan Lindqvist 06/04
Não quero desativá-lo, apenas evite o redirecionamento. Gostaria que o servidor para a saída do index.htmlsem redirecionamento
Jonathan Gurebo
Por "isso" eu estava me referindo ao comportamento normal com um redirecionamento do URL incorreto para o URL correto. Veja a resposta do @kasperd para algumas das razões pelas quais seria uma má idéia veicular o conteúdo de, por exemplo /social. (Além disso, apenas, em geral, com o mesmo conteúdo em vários URLs geralmente não é desejado.)
Håkan Lindqvist

Respostas:

10

O envio dos dados sem redirecionamento quebraria os links relativos. Se http://server/directorycontiver file, o URL completo para isso seria http://server/directory/file. Um link especificado como <a href="file">indicará http://server/directory/filese o URL base é http://server/directory/, mas se fosse apenas http://server/directoryo URL base, ele apontaria para http://server/fileele, que não é o resultado pretendido.

O Apache poderia ter gerado a listagem de diretórios de duas maneiras diferentes, dependendo da URL, em vez de redirecionar. No entanto, isso não funcionaria se houvesse um index.htmlarquivo no diretório Então o Apache está usando a abordagem, que funciona nos dois casos.

Esse não é um comportamento novo, uma década atrás o Apache estava se comportando da mesma maneira. Clientes que não podem manipular um redirecionamento deveriam ter sido corrigidos agora. Mas, para qualquer cliente que não pode manipular um redirecionamento, o Apache deve enviar um pequeno arquivo html com um link que pode ser seguido.

Kasperd
fonte
Isso não responde à pergunta. Está correto, que os links relativos podem ficar quebrados. Mas se alguém quiser entregar conteúdo para um caminho sem uma barra à direita, ele poderá ter recursos para isso, por exemplo, quando uma solicitação POST for enviada para um serviço da Web. Não há links relativos nos serviços da web, e um redirecionamento fará com que o corpo do POST se perca.
dr Fu Manchu
9

mod_diradiciona esse redirecionamento e você pode desativá-lo com uma DirectorySlash Offdiretiva.

Observe, no entanto, que desativar o redirecionamento da barra final pode causar a quebra de algumas páginas. Se a página que está sendo retornada contiver links relativos, esses URLs serão resolvidos de forma diferente se a página for veiculada sem a barra final.

200_success
fonte