Apache2 mod_rewrite URL limpo - funcionando, mas arquivos não acessíveis

Apache2 mod_rewrite URL limpo - funcionando, mas arquivos não acessíveis

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!

informação relacionada