Apache2:带有重写规则的 400 个错误请求,错误日志中没有任何内容?

nee*_*zer 5 php mod-rewrite logging apache-2.2

这让我发疯。

背景:我正在使用 Mac OS X 10.6 附带的内置 Apache2 和 PHP

我有一个虚拟主机设置如下:

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>
Run Code Online (Sandbox Code Playgroud)

这是在/private/etc/apache2/users/neezer.conf.

我的代码lobster project是带有CodeIgniter 框架的PHP 。尝试加载http://lobster.dev:81/给了我:

400 错误请求

通常,我会去检查我的日志,看看是什么原因造成的,但我的日志是空的!我看着这两个/private/var/log/apache2/error_log/private/var/log/apache2/lobster_error,既不记录与我已在400的任何消息LogLevel设置为debug/private/etc/apache2/http.conf

删除重写规则可以消除错误,但这些相同的规则适用于我的 MAMP 主机。我已经仔细检查并rewrite_module加载到我的默认 Apache 安装中。我的http.conf可以在这里找到:https : //gist.github.com/1057091

是什么赋予了?如果您需要任何其他信息,请告诉我。

注意:我不想将重写规则添加到.htaccess项目目录中(它已签入 git repo,我不想碰它)。

Ste*_*ski 6

对于复杂的 mod_rewrite 规则,最好记录事件序列以查看发生了什么。使用RewriteLog执行此操作,并启动RewriteLogLevel以查看详细信息。

mod_rewrite 非常灵活,用rewrite 规则可以做很多事情,也很复杂。局外人在没有看到更广泛的背景的情况下很难调试您的规则。最好的办法是自己调试它。当您在第二个窗口中试验配置更改时,在一个窗口中观察日志。做一个小改动,保存文件,重新加载 apache 并再次点击 URL。重复。

这是 Apache手册中对 RewriteLog 的一个很好的描述:

重写日志

在使用 mod_rewrite 强大而复杂的功能时,几乎总是需要使用 RewriteLog 来帮助调试。此日志文件详细分析了重写引擎如何转换请求。详细程度由 RewriteLogLevel 指令控制。