mod_rewrite不转发GET参数


9

我在开发计算机上使用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

Answers:


16

您是否尝试过使用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。*的文件,并有效地伪造了一个类型图,该类型图对所有这些文件进行了命名,为它们分配了与客户端要求提供名称时相同的媒体类型和内容编码。然后,它选择最符合客户要求的匹配项。

启用Multiviews会告诉Apache在URI实际未指向现有位置时猜测要使用哪个文件。

解:

通过-MultiViews在您的.htaccess中使用或将其全部保留来禁用多视图。


1
我也想提出建议,但是我没有得到建议:不需要-至少在阅读手册后我不这么认为。好奇这个问题将如何解决
pilif

1
不幸的是,在这种情况下,QSA标志没有任何改变。GET参数是规则附加的,而不是原始URL的附加。
Vegard Larsen,2009年

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>

我不知道为什么这样


2
看到我以前的修订答案的解释:serverfault.com/questions/60/...
阿伦Rotteveel

0

在您的htaccess文件中禁用-MultiViews,如下所示

RewriteEngine on
Options -Indexes -MultiViews

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

这将解决问题

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.