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

这使我疯狂。

背景:我正在使用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> 

这在/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 ,并且都没有logging与400有关的任何消息。我将LogLevel设置为在/private/etc/apache2/http.conf

删除重写规则摆脱了错误,但这些相同的规则在我的MAMP主机上工作。 我已经仔细检查,并在我的默认Apache安装加载rewrite_module 。 我的http.conf可以在这里find: https : http.conf

是什么赋予了? 让我知道如果你需要任何额外的信息。

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

对于复杂的mod_rewrite规则,logging事件序列以查看发生了什么是个好主意。 使用RewriteLog来执行此操作,并调整RewriteLogLevel以查看详细信息。

mod_rewrite非常灵活,可以用重写规则做很多事情,也很复杂。 一个局外人在debugging你的规则时会遇到麻烦,而没有看到更广泛的背景 你可以自己debugging最好的东西。 在第二个窗口中尝试configuration更改时,在一个窗口中观察日志。 做一个小改动,保存文件,重新加载Apache并再次点击URL。 重复。

下面是从Apache 手册中对RewriteLog的一个很好的描述:

重写日志

当使用mod_rewrite的强大和复杂function时,几乎总是需要使用RewriteLog来帮助debugging。 这个日志文件产生了重写引擎如何转换请求的详细分析。 详细程度由RewriteLogLevel指令控制。

您在<virtualhost>上下文中的replace使用非绝对URL。 您不能在Directory / htaccess上下文之外执行此操作。

其他一些笔记,这些笔记变得有点太大而不能被包含在一个简单的评论中:

RewriteCond $1作品,但它是相当危险和脆弱的。 特别是,你可以很容易地重写RewriteRule,以便完全禁用RewriteCond的function,而且你永远不会知道你有。 build议使用%{REQUEST_URI}作为解决scheme,即RewriteCond %{REQUEST_URI} ^/(index\.php|resources|robots\.txt)

下一期:这两行:

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

没有function提供。 它们或者需要被放置在一个<Directory>节中,或者被修改为使用向前看的macros(例如RewriteCond %{LA-U:REQUEST_FILENAME} !-f )。

你需要删除/的实际原因是.htaccess去掉了RewriteRule的第一个参数的前面/后面,而在/ httpd.conf(或者它的Include d文件)中,它被完整地提交给RewriteRules,这是重要的要记住,如果您曾经尝试将此规则移回到.htaccess中。 您可以通过执行像RewriteRule ^/?(.*)$ index.php/$1 [L,QSA]这样的方法将规则重新修改为.htaccess / httpd.conf-agnostic。

最后一个注意事项:正如你在上面的规则中看到的,你不需要使用反斜杠来跳过/