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解析器.
我该怎么做才能解决这个问题?
我认为您收到的错误消息不是来自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中摆弄它,如果它仍然不工作 - 你可能会发现斜杠被过滤掉了
解决此问题的一种方法是用不会破坏 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 中(因此您可能根本不想使用下划线)。
对于 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)
| 归档时间: |
|
| 查看次数: |
15372 次 |
| 最近记录: |