13

我正在尝试创建一个像这样工作的 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

4 回答 4

10

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

我使用 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 中摆弄- 您可能会发现斜杠被过滤掉了

于 2008-11-22T23:06:19.197 回答
4

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


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

这将用下划线替换所有正斜杠。我敢肯定它类似于您对正斜杠进行编码的操作。然后在其他页面上检索值时,只需使用以下内容:


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

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

于 2008-12-08T12:05:18.040 回答
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"
    }
}
?>

编辑:在重新阅读您的问题时,您似乎想将部分 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
    }
}
?>
于 2008-11-22T21:40:10.790 回答
0

在配置文件中更改您的 allowed_uri_chars 索引

$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';
于 2010-07-23T17:00:40.210 回答