我在开发机器上设置带有 mod_rewrite 的 Apache 时遇到了问题。Mod_rewrite 处于活动状态,并且对某些规则运行良好。但有些规则无法按预期运行,例如:
RewriteRule ^static/([^/]+)/([^/]+) /static.php?sISOCode=$1&sPage=$2
在 static.php 中我执行以下操作(用于调试):
<?php
print_r($_GET); print_r($_POST); print_r($_SERVER); die();
打印(从 $_SERVER 数组中删除一些项目):
Array
(
)
Array
(
)
Array
(
[SERVER_SIGNATURE] => <address>Apache/2.2.11 (Ubuntu) PHP/5.2.6-3ubuntu4.1 with Suhosin-Patch Server at alpha.prove.no Port 80</address>
[SERVER_SOFTWARE] => Apache/2.2.11 (Ubuntu) PHP/5.2.6-3ubuntu4.1 with Suhosin-Patch
[SERVER_ADDR] => 127.0.0.1
[SERVER_PORT] => 80
[REMOTE_ADDR] => 127.0.0.1
[DOCUMENT_ROOT] => /home/veg/workspace/project
[SERVER_ADMIN] => webmaster@localhost
[SCRIPT_FILENAME] => /home/veg/workspace/project/static.php
[REMOTE_PORT] => 38954
[GATEWAY_INTERFACE] => CGI/1.1
[SERVER_PROTOCOL] => HTTP/1.1
[REQUEST_METHOD] => GET
[QUERY_STRING] =>
[REQUEST_URI] => /static/no/startCar
[SCRIPT_NAME] => /static.php
[PATH_INFO] => /no/startCar
[PATH_TRANSLATED] => redirect:/index.php/startCar
[PHP_SELF] => /static.php/no/startCar
[argv] => Array
(
)
[argc] => 0
)
不知何故,根据规则设置的 GET 参数没有通过。其他设置中使用了相同的 .htaccess 文件,并且运行良好。此虚拟域的 Apache 配置:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName project.example.com
DocumentRoot /home/veg/workspace/project
<Directory /home/veg/workspace/project>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
ErrorLog /var/log/apache2/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog /var/log/apache2/access.log combined
</VirtualHost>
发生这种情况时,访问日志和错误日志不会输出任何内容。欢迎提出任何想法。
对于同一个文件,有效的规则示例:
RewriteRule ^faq/?$ /static.php?sISOCode=no&sPage=faq
答案1
您是否尝试过使用QSA(查询字符串附加)旗帜?
RewriteRule ^static/([^/]+)/([^/]+) /static.php?sISOCode=$1&sPage=$2 [QSA]
编辑和实际答案如下:
此问题是由 Apache 的mod_negotiation,特别是您正在使用的 MultiViews 选项:
MultiViews 的效果如下:如果服务器收到对 /some/dir/foo 的请求,如果 /some/dir 启用了 MultiViews,并且 /some/dir/foo 不存在,则服务器将读取目录以查找名为 foo.* 的文件,并有效地伪造一个类型映射来命名所有这些文件,为它们分配与客户端按名称请求其中一个文件时相同的媒体类型和内容编码。然后,它会选择与客户端要求最匹配的文件。
启用多视图会告诉 Apache 在 URI 实际上并未指向现有位置时猜测要使用哪个文件。
解决方案:
通过-MultiViews
在 .htaccess 中使用或将其完全删除来禁用多视图。
答案2
解决方案是更改 Apache 配置,如下所示:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName project.example.com
DocumentRoot /home/veg/workspace/project
<Directory /home/veg/workspace/project>
Options FollowSymLinks
# AllowOverride All
# Order allow,deny
# allow from all
</Directory>
ErrorLog /var/log/apache2/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog /var/log/apache2/access.log combined
</VirtualHost>
但我不知道为什么这样做
答案3
禁用 htaccess 文件中的 -MultiViews 如下所示
RewriteEngine on
Options -Indexes -MultiViews
RewriteRule ^static/([^/]+)/([^/]+) /static.php?sISOCode=$1&sPage=$2
这将解决问题