mod_rewrite 不转发 GET 参数

Veg*_*sen 9 php mod-rewrite rewrite apache-2.2

我在我的开发机器上使用 mod_rewrite 设置 Apache 时遇到问题。Mod_rewrite 处于活动状态,并且适用于某些规则。某些规则无法按预期工作,例如:

RewriteRule ^static/([^/]+)/([^/]+)     /static.php?sISOCode=$1&sPage=$2
Run Code Online (Sandbox Code Playgroud)

在 static.php 中,我这样做(用于调试):

<?php
print_r($_GET); print_r($_POST); print_r($_SERVER); die();
Run Code Online (Sandbox Code Playgroud)

其中打印(从 $_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
)
Run Code Online (Sandbox Code Playgroud)

不知何故,根据规则设置的 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>
Run Code Online (Sandbox Code Playgroud)

发生这种情况时,访问日志和错误日志不输出任何内容。任何想法表示赞赏。

适用于同一文件的规则示例:

RewriteRule ^faq/?$                   /static.php?sISOCode=no&sPage=faq
Run Code Online (Sandbox Code Playgroud)

Aro*_*eel 16

您是否尝试过使用QSA(查询字符串追加)标志?

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

编辑和实际答案如下:

此问题是由 Apache 的mod_negotiation引起的,特别是您正在使用的 MultiViews 选项:

MultiViews的作用如下:如果服务器收到/some/dir/foo的请求,如果/some/dir开启了MultiViews,而/some/dir/foo不存在,则服务器读取目录寻找foo.* 文件,并有效地伪造了一个类型映射,为所有这些文件命名,为它们分配相同的媒体类型和内容编码,如果客户端按名称要求其中之一。然后它会选择最符合客户要求的方案。

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

解决方案:

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