我有以下设置;一个非常简单的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框架中的路由器逻辑解释。如果不对其进行编码,路由器就无法区分作为路径分隔符的斜杠和作为路径组件一部分的斜杠。
答案 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>