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

1

Servidor: Debian Jessie Apache: 2.4.9-1 PHP: 5.5

O que eu quero é que todos os arquivos e não-diretórios sejam redirecionados para index.php, onde eu mesmo os manipulo. Devido à natureza do meu projeto, preciso trabalhar a partir de um host virtual.

Estou usando hospedagem virtual (vHosts) junto com mod_rewrite em um projeto da 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 como esperado e as regras de reescrita estão redirecionando as solicitações para index.php conforme o esperado. No entanto, 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, já que as instruções de condição de reescrita devem corrigir isso.

Todas as permissões de pasta estão definidas para 755, todos os arquivos para 644.

Eu pude confirmar sem dúvida que as condições de reescrita estão combinando quando não deveriam. Eu pude ver isso olhando o log de erros do apache com saída de depuração habilitada para mod_rewrite.

Por que as duas instruções RewriteCond estão combinando incorretamente?

Eles talvez não estejam vendo o vHost DocumentRoot?

UPDATE: DESLIGAR o mecanismo de reescrita me permite acessar o arquivo com o qual estou testando. IE, meu URI está correto. Eu sei que meu caminho é bom, as condições estão falhando por algum motivo.

    
por Cody Smith 10.05.2014 / 09:40

1 resposta

2

Para quem usa o Apache 2.4 com hosts virtuais & querendo usar mod_rewrite dentro do vHost disse com condições de reescrita que precisam verificar arquivos ou pastas dentro do vHost, isto é como fazer 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 DEPOIS da hospedagem virtual foi aplicada. Mas isso não lhe dará o URI, então precisamos adicionar o %{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 isso ajude!

    
por 10.05.2014 / 11:22