我正在使用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。关于问题可能是什么想法?
答案 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
变量?