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

13 php url uri codeigniter urlencode

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

/app/process/example.com/index.html
Run Code Online (Sandbox Code Playgroud)

换句话说,

/app/process/$URL
Run Code Online (Sandbox Code Playgroud)

我然后检索网址

$this->uri->segment(3);
Run Code Online (Sandbox Code Playgroud)

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

/app/process/example.com%2Findex.html
Run Code Online (Sandbox Code Playgroud)

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

Not Found

The requested URL /app/process/example.com/index.html was not found on this server. 
Run Code Online (Sandbox Code Playgroud)

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

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

Tom*_*igh 9

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

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

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

AllowEncodedSlashes On

有关更多信息,请参阅文档

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

  • 我刚刚在网站上解决了这个问题.这有点像黑客,但它完成了工作:我对URL进行了双重编码.这样REQUEST_URI的urldecode就不会过早地恢复/. (3认同)

Ste*_*ley 5

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


$uri = 'example.com/index.html';
$pattern = '"/"';
$new_uri = preg_replace($pattern, '_', $uri);
Run Code Online (Sandbox Code Playgroud)

这会将所有正斜杠替换为下划线。我确信这与您对正斜杠进行编码的操作类似。然后,在检索其他页面上的值时,只需使用如下所示的内容:


$pattern = '/_/';
$old_uri = preg_replace($pattern, '/', $new_uri);
Run Code Online (Sandbox Code Playgroud)

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


Kyl*_*nin 1

对于 CodeIgniter,URL 的路径对应于一个控制器、控制器中的函数以及函数的参数。

您的 URL /app/process/example.com/index.html 将对应于 app.php 控制器、内部的 process 函数以及两个参数 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"
    }
}
?>
Run Code Online (Sandbox Code Playgroud)

编辑:在重读您的问题时,您似乎想将部分 URL 解释为另一个 URL。为此,您需要编写函数来接受可变数量的参数。为此,您可以使用函数 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
    }
}
?>
Run Code Online (Sandbox Code Playgroud)