Apache2: 400 Solicitação incorreta com regras de reconfiguração, nada no log de erros?

5

Isso está me deixando louco.

Histórico: estou usando o Apache2 & integrado PHP que vem com o Mac OS X 10.6

Eu tenho uma configuração vhost da seguinte forma:

NameVirtualHost *:81

<Directory "/Users/neezer/Sites/">
    Options Indexes MultiViews
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

<VirtualHost *:81>
    ServerName lobster.dev
    ServerAlias *.lobster.dev
    DocumentRoot /Users/neezer/Sites/lobster/www

    RewriteEngine On
    RewriteCond $1 !^(index\.php|resources|robots\.txt)
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php/$1 [L,QSA]

    LogLevel debug
    ErrorLog /private/var/log/apache2/lobster_error
</VirtualHost>

Isso está em /private/etc/apache2/users/neezer.conf .

Meu código no lobster project é PHP com a estrutura do CodeIgniter . Tentando carregar o link me dá:

400 Bad Request

Normalmente, eu verifico meus logs para ver o que causou isso, mas meus logs estão vazios! Eu olhei em /private/var/log/apache2/error_log e /private/var/log/apache2/lobster_error e nem registro QUALQUER mensagem relacionada ao 400. Eu tenho LogLevel definido como debug em /private/etc/apache2/http.conf .

Remover as regras de reescrita elimina o erro, mas essas mesmas regras funcionam no meu host MAMP. Eu verifiquei duas vezes e rewrite_module está carregado na minha instalação padrão do Apache. Meu http.conf pode ser encontrado aqui: link

O que dá? Deixe-me saber se você precisar de alguma informação adicional.

OBSERVAÇÃO: NÃO quero adicionar as regras de reescrita a .htaccess no diretório do projeto (ele está marcado em um repositório do git e não quero tocá-lo).

    
por neezer 30.06.2011 / 23:54

3 respostas

6

Para regras complicadas de mod_rewrite, é uma boa ideia registrar a sequência de eventos para ver o que está acontecendo. Faça isso usando o RewriteLog e aumente o RewriteLogLevel para ver os detalhes.

mod_rewrite é muito flexível e pode-se fazer muitas coisas com as regras de reescrita, e também é bastante complicado. Um estranho terá problemas para depurar suas regras sem ver o contexto mais amplo. A melhor coisa que você pode fazer é depurar por conta própria. Assista os logs em uma janela enquanto você experimenta as alterações de configuração em uma segunda janela. Faça uma pequena alteração, salve o arquivo, recarregue o apache e acesse a URL novamente. Repita.

Veja uma boa descrição do RewriteLog no manual do Apache:

Rewrite Log

When using the powerful and complex features of mod_rewrite, it is almost always necessary to use the RewriteLog to help in debugging. This log file produces a detailed analysis of how the rewriting engine transforms requests. The level of detail is controlled by the RewriteLogLevel directive.

    
por 01.07.2011 / 00:28
2

Sua substituição no contexto <virtualhost> usa um URL não absoluto. Você não pode fazer isso fora do contexto Directory / htaccess.

    
por 03.07.2011 / 17:22
1

Algumas outras notas, que se tornaram um pouco grandes demais para serem contidas em um mero comentário:

RewriteCond $1 funciona, mas é bastante perigoso e quebradiço. Em particular, você poderia facilmente ter reescrito o RewriteRule para desabilitar completamente a funcionalidade do RewriteCond, e você nunca saberia. O uso de %{REQUEST_URI} é recomendado como uma solução, à la RewriteCond %{REQUEST_URI} ^/(index\.php|resources|robots\.txt) .

Próxima edição: estas duas linhas:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

não são funcionais como apresentados. Eles precisam ser colocados dentro de uma sub-rotina <Directory> ou modificados para usar as macros de look-ahead (por exemplo, RewriteCond %{LA-U:REQUEST_FILENAME} !-f ).

A causa real de você precisar remover o / é que .htaccess retira o / do primeiro argumento de RewriteRule, enquanto ele é entregue com / intact para RewriteRules no httpd.conf (ou seus arquivos Include d), que é algo importante para lembrar no caso de você tentar mover essa regra de volta para um .htaccess. Você pode retrabalhar a Regra para ser .htaccess / httpd.conf agnóstico fazendo algo como RewriteRule ^/?(.*)$ index.php/$1 [L,QSA] .

Uma última nota: como você pode ver na regra acima, você não precisa escapar do / com uma barra invertida.

    
por 01.07.2011 / 03:46