
Servidor: Debian Jessie Apache: 2.4.9-1 PHP: 5.5
O que eu quero é que todos os não-arquivos e não-diretórios sejam redirecionados para index.php, onde eu mesmo os trato. Devido à natureza do meu projeto, devo trabalhar em um host virtual.
Estou usando hospedagem virtual (vHosts) junto com mod_rewrite em um projeto web em que estou trabalhando. Aqui está o arquivo vHost...
<VirtualHost *:80>
ServerName foo.com
ServerAlias www.foo.com
ServerAdmin [email protected]
DocumentRoot /srv/foo/main/www/
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php [L]
</IfModule>
</VirtualHost>
O vHost está funcionando conforme o esperado e as regras de reescrita estão redirecionando as solicitações para index.php conforme o esperado. Porém quando tento acessar arquivos no servidor, por exemplo:
foo.com/css/style.css
localizado em:
/srv/foo/main/www/css/style.css
minha solicitação é redirecionada para index.php
Isso é estranho, pois as declarações de condição de reescrita devem corrigir isso.
Todas as permissões de pasta são definidas como 755, todos os arquivos como 644.
Consegui confirmar sem dúvida que as condições de reescrita correspondem quando não deveriam. Consegui ver isso olhando o log de erros do Apache com a saída de depuração habilitada para mod_rewrite.
Por que as duas instruções RewriteCond correspondem incorretamente?
Talvez eles não estejam vendo o vHost DocumentRoot?
ATUALIZAÇÃO: DESLIGAR o mecanismo de reescrita me permite acessar o arquivo que estou testando. Ou seja, meu URI está correto. Eu sei que meu caminho é bom, as condições estão falhando por algum motivo.
Responder1
Para qualquer pessoa que use o Apache 2.4 com hosts virtuais e queira usar o mod_rewrite dentro do referido vHost com condições de reescrita que precisam verificar arquivos ou pastas dentro do vHost, é assim que se fazem as condições de reescrita...
<VirtualHost *:80>
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{CONTEXT_DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteCond %{CONTEXT_DOCUMENT_ROOT}%{REQUEST_URI} !-d
RewriteRule ^(.*)$ /index.php [L]
</IfModule>
</VirtualHost>
Eu inventei isso e parece estar funcionando bem.
A explicação...
%{CONTEXT_DOCUMENT_ROOT}%{REQUEST_URI}
fornecerá uma raiz de documento sensível ao contexto. Ou seja, a raiz do documento APÓS a hospedagem virtual foi aplicada. Mas isso não fornecerá o URI, então precisamos adicioná-lo %{REQUEST_URI}
para finalizar o trabalho.
CONTEXT_DOC_ROOT == /srv/foo/main/www
REQUEST_URI == /css/style.css
CONTEXT_DOC_ROOT + REQUEST_URI == /srv/foo/main/www/css/style.css
O resto é fácil. Molho incrível. Espero que isto ajude!