Apache2 - 301 Redirect when missing “/” no final do diretório no url

8

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

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

Veja este exemplo ao vivo:

Solicitação do usuário:

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

Resposta do servidor Apache:

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

Solicitação do usuário:

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

Resposta do servidor 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"

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

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 evitar o redirecionamento e enviar o index.html diretamente? Os clientes precisam enviar duas solicitações, o que é realmente desnecessário. E talvez alguns dos clientes não permitam Redirects e não poderão acessar o site sem a barra final ("/").

Eu não quero desativar o redirecionamento. Eu não quero que o servidor envie a resposta diretamente sem nenhum redirecionamento. Mesmo quando solicitando /social .

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

O que vocês acham?

    
por Jonathan Gurebo 06.04.2014 / 10:40

2 respostas

9

Enviar os dados sem um redirecionamento quebraria os links relativos. Se http://server/directory contiver file , o URL completo para isso seria http://server/directory/file . Um link especificado como <a href="file"> apontará para http://server/directory/file se o URL base for http://server/directory/ , mas se o URL base for apenas http://server/directory , ele apontará para http://server/file , o que não é o resultado pretendido.

O Apache poderia ter gerado a listagem do diretório de duas maneiras diferentes, dependendo do URL, em vez de redirecioná-lo. No entanto, isso não funcionaria se houvesse um arquivo index.html no diretório. Então, em vez disso, o Apache está usando a abordagem, que funciona nos dois casos.

Este não é um comportamento novo, uma década atrás, o Apache estava se comportando da mesma maneira. Os clientes que não conseguem lidar com um redirecionamento já devem ter sido corrigidos. Mas para qualquer cliente que não consiga lidar com um redirecionamento, o Apache deve estar enviando um pequeno arquivo html com um link que possa ser seguido.

    
por 06.04.2014 / 10:58
8

mod_dir adiciona esse redirecionamento e você pode desativá-lo com um DirectorySlash Off

Observe, no entanto, que desabilitar o redirecionamento da barra à direita 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 maneira diferente se a página for veiculada sem a barra final.

    
por 06.04.2014 / 11:28