url 编码的正斜杠破坏了我的 codeigniter 应用程序
Posted
技术标签:
【中文标题】url 编码的正斜杠破坏了我的 codeigniter 应用程序【英文标题】:url encoded forward slashes breaking my codeigniter app 【发布时间】:2010-09-23 15:09:53 【问题描述】:我正在尝试创建一个像这样工作的 url 字符串:
/app/process/example.com/index.html
换句话说,
/app/process/$URL
然后我用
检索 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 解析器。
我能做些什么来解决这个问题?
【问题讨论】:
【参考方案1】:我认为您收到的错误消息不是来自 codeigniter,而是来自您的网络服务器。
我使用 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']
如果它仍然无法正常工作 - 您可能会发现斜杠被过滤掉了
【讨论】:
这是正确的。然而,即使修复后您也可能会遇到问题,因为定义 PATH_INFO 的 CGI 标准要求字符串经过一轮 URL 解码,这可能会破坏斜线。仅在 Apache 上,您可以使用 REQUEST_URI 代替它不会受到此影响...不知道 CI 是否可以使用它。 我刚刚在一个网站上解决了这个问题。这有点小技巧,但它完成了工作:我对 URL 进行了双重 urlencoded。这样,REQUEST_URI 的 urldecode 就不会过早恢复 /。 其实你想要的大概是AllowEncodedSlashes NoDecode
忘了说至少需要 apache 2.3。如果您被困在下面,请尝试使用/
作为斜线,然后根据需要来回替换它们。它们会像在 html 中一样显示。【参考方案2】:
解决这个问题的一种方法是用不会破坏 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 中(因此您可能根本不想使用下划线)。
【讨论】:
【参考方案3】:使用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
?>
【讨论】:
【参考方案4】:在配置文件中更改您的 allowed_uri_chars 索引
$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';
【讨论】:
以上是关于url 编码的正斜杠破坏了我的 codeigniter 应用程序的主要内容,如果未能解决你的问题,请参考以下文章