Apache URL重写行为不端

时间:2012-01-27 15:04:06

标签: apache mod-rewrite url-rewriting urlencode httpd.conf

我有以下设置;一个非常简单的URL重写设置,带有测试设置

// ----- test.php -----
<?php

phpinfo();
// ----- test.php -----

test.local的配置如下。

<VirtualHost *:80>
        ServerName test
        ServerAlias test.*
        DocumentRoot /var/www/test
</VirtualHost>

<Directory "/var/www/test/">
        RewriteEngine On
        RewriteBase /
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule .* test.php/$0 [R,NE]
</Directory>

现在,如果我发出请求GET http://test.local/my-path-info,默认的phpinfo()页面会按预期显示,如果我在路径信息中添加斜杠,那么也可以。但是,如果我在URL(示例%2F)中添加编码的正斜杠GET http://test.local/my-path-info%2fsomething-else,则会显示为404 Not found。基本上它没有到达php文件。

知道为什么会这样,以及如何解决这个问题?

安装在Apache 2.2.13,Linux上的PHP 5.3.8(Centos 5.x)上。

注意:我在这里尝试做的是在其中一个path-info组件中添加正斜杠,这样它就不会被MVC框架中的路由器逻辑解释。如果不对其进行编码,路由器就无法区分作为路径分隔符的斜杠和作为路径组件一部分的斜杠。

1 个答案:

答案 0 :(得分:0)

由于apache版本不支持NoDecode作为AllowEncodedSlashes的选项,我最终使用了以下组合。我还必须对请求URI进行双重url编码。不理想但暂时适合我。

<VirtualHost *:80>
        ServerName test
        ServerAlias test.*
        DocumentRoot /var/www/test
        AllowEncodedSlashes On
</VirtualHost>

<Directory "/var/www/test/">
        RewriteEngine On
        RewriteBase /
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d

        # Option B below was the key!
        RewriteRule .* test.php/$0 [R,NE,B]
</Directory>