url编码正斜杠打破我的codeigniter应用程序

时间:2008-11-22 21:30:51

标签: php url codeigniter uri urlencode

我正在尝试创建一个像这样工作的url字符串:

/app/process/example.com/index.html
换句话说,

/app/process/$URL
然后我用

检索网址
$this->uri->segment(3);

URL中的正斜杠当然是访问uri段的问题,因此我将继续并对url编码URL部分:

/app/process/example.com%2Findex.html

..但现在我得到404说......

Not Found

The requested URL /app/process/example.com/index.html was not found on this server. 

似乎我的正斜杠的url编码打破了CI​​的URI解析器。

我该怎么做才能解决这个问题?

4 个答案:

答案 0 :(得分:9)

我认为您收到的错误消息不是来自codeigniter,而是来自您的Web服务器。

我使用Apache2复制了这个,甚至没有使用CodeIgniter:我创建了一个文件index.php,然后访问index.php/a/b/c - 它运行正常。如果我然后尝试访问index.php/a/b/c%2F我从Apache获得了404。

我通过添加到我的Apache配置解决了它:

AllowEncodedSlashes On

有关详细信息,请参阅the documentation

一旦你完成了这个,你可能需要在codeigniter中使用$config['permitted_uri_chars'],如果它仍然无效 - 你可能会发现斜杠被过滤掉了

答案 1 :(得分:4)

解决此问题的一种方法是替换您在URI段中传递的任何正斜杠,并使用不会破坏CodeIgniter URI解析器的内容。例如:


$uri = 'example.com/index.html';
$pattern = '"/"';
$new_uri = preg_replace($pattern, '_', $uri);

这将用下划线替换所有正斜杠。我确信它与你正在做的正斜率编码相似。然后,当在另一页上检索值时,只需使用以下内容:


$pattern = '/_/';
$old_uri = preg_replace($pattern, '/', $new_uri);

将使用正斜杠替换所有下划线以恢复旧URI。当然,您需要确保您使用的任何字符(在这种情况下为下划线)不会出现在您将要传递的任何可能的URI中(因此您可能根本不想使用下划线)。

答案 2 :(得分:0)

使用CodeIgniter,URL的路径对应于控制器,控制器中的函数以及函数的参数。

您的网址/app/process/example.com/index.html将对应于app.php控制器,里面的流程函数以及两个参数example.com和index.html:

<?php
class App extends Controller {
    function process($a, $b) {
       // at this point $a is "example.com" and $b is "index.html"
    }
}
?>

编辑:在重新阅读您的问题时,您似乎希望将部分网址解释为另一个网址。为此,您需要编写函数以获取可变数量的参数。为此,您可以使用函数func_num_args和func_get_arg,如下所示:

<?php
class App extends Controller {
    function process() {
        $url = "";
        for ($i = 0; $i < func_num_args(); $i++) {
            $url .= func_get_arg($i) . "/";
        }

        // $url is now the url in the address
    }
}
?>

答案 3 :(得分:0)