mod_rewrite不会转发GET参数

我在开发机器上用mod_rewrite设置Apache时遇到了麻烦。 Mod_rewrite是活动的,并且对于一些规则来说工作得很好。 有些规则不能像预期那样工作,就像这样:

RewriteRule ^static/([^/]+)/([^/]+) /static.php?sISOCode=$1&sPage=$2 

在static.php我这样做(debugging):

 <?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文件正在使用其他设置,并运行良好。 这个虚拟域的Apacheconfiguration:

 <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 

你有没有尝试过使用QSA(查询string追加)标志?

 RewriteRule ^static/([^/]+)/([^/]+) /static.php?sISOCode=$1&sPage=$2 [QSA] 

编辑和实际答案如下:

这个问题是由Apache的mod_negotiation引起的,特别是你使用的MultiViews选项:

MultiView的效果如下:如果服务器接收到/ some / dir / foo的请求,如果/ some / dir启用了MultiViews,并且/ some / dir / foo不存在,则服务器读取目录以查找名为foo。*的文件,并且有效地伪造了一个types映射,它命名了所有这些文件,为它们分配了相同的媒体types和内容编码,如果客户要求其中一个名称的话,将会有相同的媒体types和内容编码。 然后select最符合客户的要求。

启用多视图会告诉Apache在URI实际上不指向现有位置时猜测使用哪个文件。

解:

通过在你的.htaccess中使用-MultiViews来禁用多-MultiViews ,或者把它们全部放在一起。

解决scheme是更改Apacheconfiguration,如下所示:

 <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> 

但是,我不知道为什么这个工作