我正在尝试创建一个像这样工作的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解析器。
我该怎么做才能解决这个问题?
答案 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)