Apache mod_rewrite在WAMPServer中返回错误请求

时间:2011-02-26 15:49:13

标签: php apache mod-rewrite wamp wampserver

我正在使用WAMPServer 2.1运行Windows 7 64位。 Apache运行的版本是2.2.17。我正在尝试在httpd.conf中设置一个简单的重写规则:

<IfModule rewrite_module>
RewriteEngine on
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^(.*)$ index.php?page=$1 [PT,QSA,L]
</IfModule>

我以前使用过更简单的RewriteRules,没有正则表达式,重写表达式等。但是,在此时,似乎在此规则处于活动状态时尝试访问任何URL时出现400 Bad Request错误。只要发生这种情况,Apache日志文件就会出现这些错误:

[Sat Feb 26 10:24:18 2011] [error] [client 127.0.0.1] Invalid URI in request GET /index.php HTTP/1.1
[Sat Feb 26 10:24:21 2011] [error] [client 127.0.0.1] Invalid URI in request GET / HTTP/1.1

我尝试点击localhost/index.php的第一个错误。第二个我刚尝试localhost

此外,即使我使用更简单的规则,RewriteCond行似乎也无法正常工作:无论如何,静态现有文件(如style.css)都被重新路由。

启用RewriteLogging似乎让Apache崩溃,似乎是documented issue on 64-bit machines running Windows 7。关于问题可能是什么想法?

2 个答案:

答案 0 :(得分:1)

这里有两个问题可能会导致你的麻烦。首先,您无法在服务器上下文中轻松检查文件是否存在(与httpd.conf一样),因为请求尚未映射到文件系统。

如果您对静态资源的请求恰好与您的DOCUMENT_ROOT之外的文件系统结构直接对应,您可以通过在传入的REQUEST_URI之前附加DOCUMENT_ROOT的值来解决此问题,如下所示:

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d

如果您的静态资源的路径在某个地方被转换,mod_rewrite documentation建议使用以下内容,它将根据请求URI发出子请求以执行前瞻:

RewriteCond %{LA-U:REQUEST_FILENAME} !-f
RewriteCond %{LA-U:REQUEST_FILENAME} !-d

这种方法虽然比较昂贵,所以尽量使用第一种方法。

其次,传递回请求的URI实际上是无效的,因为它需要前导斜杠。更正并将其与上述新条件相结合可为您提供此修改后的规则集:

RewriteEngine On

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d
RewriteRule ^.*$ /index.php?page=$0 [PT,QSA,L]

请注意,此处的page值始终具有前导斜杠,因此您实际上可能希望使用此规则,具体取决于index.php中的处理逻辑:

RewriteRule ^/(.*)$ /index.php?page=$1 [PT,QSA,L]

答案 1 :(得分:0)

您是否尝试过设置

RewriteBase / your_directory

变量?