Eu configurei meu host virtual no Apache 2.4.7 com uma configuração muito básica:
<VirtualHost *:80>
ServerName foo.example.com
DocumentRoot /var/www/html
DirectoryIndex index.php
FallbackResource /index.php
</VirtualHost>
Abaixo da raiz do documento, tenho a seguinte estrutura:
/index.php
/help/readme.txt
Recebo os seguintes resultados quando faço solicitações:
/bla -> 200 OK
/help/ -> 404 Not Found
/help/a -> 200 OK
Parece que a existência do /help/
diretório está causando o retorno do Apache 404
porque não há nenhum index.php
, mas espero que todas as solicitações sejam invocadas /index.php
e, portanto, produzam uma 200 OK
resposta.
Não me lembro de isso ser um problema ao usar mod_rewrite
, mas prefiro usá-lo, FallbackResource
se possível. Existe uma maneira de corrigir isso?
Atualizar
Funciona se eu remover a DirectoryIndex
diretiva, mas isso sofre com problemas de atraso de cinco segundos .
Atualização 3
Estou executando o seguinte ambiente de teste; a estrutura de diretórios é a seguinte:
./htdocs
index.html
test/
bla.txt
./conf
httpd.conf
./logs
O conteúdo de httpd.conf
é:
ServerName apache-bug.local
Listen 8085
DirectoryIndex disabled
DirectorySlash Off
<VirtualHost *:8085>
DocumentRoot /home/user/apache-bug/htdocs
FallbackResource /index.html
</VirtualHost>
Meu config.nice
contém:
"./configure" \
"--enable-debugger-mode" \
"--with-apr=/usr/local/apr/bin/apr-1-config" \
"--enable-dir=static" \
"--with-mpm=prefork" \
"--enable-unixd=static" \
"--enable-authn-core=static" \
"--enable-authz-core=static" \
"$@"
Para executar o servidor:
httpd -X -d /home/user/work/apache-bug/
fonte
/bla
?Respostas:
Também estou respondendo a isso, porque tenho certeza de que o problema está relacionado a como
mod_dir.c
funciona internamente e acho que é um bug .Se um recurso não puder ser mapeado para o sistema de arquivos local, a função
fixup_dflt()
será executada, usando oFallbackResource
para determinar qual documento deve ser carregado.No entanto, quando um recurso pode ser mapeado para o sistema de arquivos local e ele é um diretório, ele tenta resolver o documento executando
fixup_dir()
; essa função itera sobre a lista deDirectoryIndex
valores até encontrar o primeiro documento adequado.No meu caso, a configuração tem uma lista vazia de
DirectoryIndex
valores, portantofixup_dir()
falhará e um 404 será retornado.O seguinte patch funciona para mim ( PR ):
Basicamente, tenta
fixup_dflt()
depois defixup_dir()
falhar.Atualização 2015-04-21
Uma correção foi enviada ao projeto, agendada para 2,5; também pode ser portado para 2.4.
Atualização 18/05/2015
A correção foi revertida porque:
Ainda estou tentando descobrir como evitar esse tipo de situação.
fonte
fixup_dir()
ignorar o FallbackResource.fixup_dir()
não deve saber sobrefixup_dflt()
, por isso, IMHO é melhor para corrigi-lo "mais acima" :)Sua configuração deve estar correta.
O problema, estranhamente, parece ser mod_deflate .
Depois de reproduzir sua configuração com sucesso aqui ( sem obter um 404), também recebi o atraso de 5 segundos. No entanto, notei que, quando o UA omite
gzip
seus Accept-Headers, a página é exibida / recebida instantaneamente. Você pode testar isso sozinhowget
.Curiosamente, a depuração adicional
strace
mostra que o apache envia o conteúdo do seuFallbackResource
para o soquete do seu cliente sem diferença perceptível no atraso para ambos os casos. Isso também é evidente na ligação, onde um pacote de respostas é enviado do servidor para o cliente após a solicitação HTTP sem nenhum atraso notável 1 .Parece que, ao usar mod_deflate nesse caso, no entanto, o UA não sabe quando os dados enviados pelo servidor terminam e, portanto, não renderiza nada antes que a conexão TCP expire 2 e seja fechada à força pelo servidor. Isso é compatível com HTTP / 1.0, onde uma conexão fechada significa final do conteúdo.
Para HTTP / 1.1 , o servidor tem outros meios disponíveis para sinalizar o final do conteúdo - mas nenhum dos quais parece acontecer aqui .
Se o bug está oculto no mod_dir ou mod_deflate, está além do meu tempo disponível no momento. Consegui que funcionasse perfeitamente, desativando a compactação gzip; como uma solução alternativa até que o problema seja resolvido definitivamente, você pode desativar seletivamente o gzip.
1 ) Isso nos diz que o problema não decorre de buffers não liberados no servidor.
2 ) Por padrão, o tempo limite é de 5 segundos no apache - é daí que são os seus 5 segundos.
fonte