【问题标题】:Apache URL Rewriting misbehavingApache URL 重写行为不端
【发布时间】:2012-02-20 13:32:24
【问题描述】:

我有下面的设置;带有测试设置的非常简单的 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)。

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

【问题讨论】:

  • 这可能会有所帮助:stackoverflow.com/questions/3235219/…
  • 你不想让 正文中的 指令不成为 Apache 全局指令吗?
  • 谢谢@Skittles,你说得对;但同时它是正确的配置,特定于我的设置。

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


【解决方案1】:

由于不支持NoDecode 作为AllowEncodedSlashes 选项的apache 版本,我最终使用了以下组合。我还必须对请求 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-07
    • 2011-04-15
    • 2010-10-30
    • 2012-05-28
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 2013-03-06
    相关资源
    最近更新 更多