DirectoryIndex não está funcionando corretamente para a URL reescrita

3

Eu tenho domain.com e sub.domain.com apontando para o mesmo servidor e estou usando mod_rewrite para reescrever URLs para sub.domain.com no subdiretório sub . Eu tenho o seguinte arquivo .htaccess na raiz do documento:

DirectoryIndex index.html index.php

# Prevent infinite rewrite loop.
RewriteCond %{ENV:REDIRECT_STATUS} ^$
# Send all requests addressing sub.domain.com...
RewriteCond %{HTTP_HOST} =sub.domain.com [NC]
# ...to the /sub directory.
RewriteRule ^ /sub%{REQUEST_URI} [QSA]

No diretório sub , tenho index.php e não index.html , mas as solicitações para http://sub.domain.com parecem ignorar index.php ao mesmo tempo e retornam 404. Se eu tiver index.html , no entanto, o seu será exibido . A única maneira de obter index.php para ser atendido é definir

DirectoryIndex index.php

mas isso não é algo que eu queira fazer para o site inteiro.

Por estranho que pareça, outros URLs além da raiz do documento exibem o comportamento normal DirectoryIndex . Por exemplo, http://sub.domain.com/search tries procura sub/search/index.html e sub/search/index.php antes de retornar 404.

Se eu consultar o diretório sub do domínio pai http://domain.com/sub , poderei ver index.php , o que me deixa completamente perplexo com o problema.

Eu incluiria o log de erros do Apache, mas estou usando hospedagem compartilhada e não tenho como aumentar o detalhamento do log. Além disso, não consegui reproduzir esse erro localmente. O servidor de hospedagem da web está usando o Apache 2.4.3 e meu servidor local é o Apache 2.4.9.

    
por mxk 23.06.2014 / 10:42

2 respostas

2

Eu tenho um problema semelhante após a atualização para o Ubuntu 14.04, que inclui o Apache 2.4.7.

Aqui está minha solução alternativa . Emule mod_dir com mod_rewrite e desative DirectoryIndex .

#DirectoryIndex index.html index.php index.htm
DirectoryIndex disabled

RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_FILENAME} /$
RewriteCond %{REQUEST_FILENAME}index.html -f
RewriteRule ^(.*)$ $1index.html  [L]

RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_FILENAME} /$
RewriteCond %{REQUEST_FILENAME}index.php -f
RewriteRule ^(.*)$ $1index.php  [L]

RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_FILENAME} /$
RewriteCond %{REQUEST_FILENAME}index.htm -f
RewriteRule ^(.*)$ $1index.htm  [L]

Espero que isso ajude.

UPDATE : A atualização para o Apache 2.4.10 corrige o problema para mim.

Graças a Ondřej Surý isto pode ser feito facilmente no Ubuntu 14.04 com apt:

add-apt-repository ppa:ondrej/apache2
apt-get update
apt-get install apache2

p.s. OP confirmou que isso também foi corrigido no Apache 2.4.9.

    
por 20.01.2015 / 05:16
1

Defina a diretiva DirectoryCheckHandler para ON .

Os documentos do Apache dizem:

Available in 2.4.8 and later. Releases prior to 2.4 implicitly act as if "DirectoryCheckHandler ON" was specified.

mod_dir costumava sempre executar suas verificações não importando qual manipulador foi definido e agora deve ser explicitamente habilitado quando não estiver usando o manipulador padrão.

    
por 06.12.2017 / 02:04