如何通过URI中的GET传递“/”?

时间:2010-02-09 21:01:11

标签: php zend-framework

解决:

此URI有效:

/controller/action?ret=%2F

我想将另外的“/”参数传递给控制器​​操作。所以我这样做了:

$par1 = urlencode('/');
$this->_redirect('/controller/action/par1/' . $par1);

但我收到此错误消息:

Not Found

The requested URL /controller/action/ret// was not found on this server.

当我在没有任何参数或参数“aaa”的情况下调用控制器动作时,它可以工作。这些URI有效:

/controller/action
/controller/action/par1/aaa
/controller/action/par1/jfhsdajkhfui454fs
/controller/action/par1
/controller/action/par1/

您可以将http://example.com放在上面所有相对URI的前面,它们是相同的。

3 个答案:

答案 0 :(得分:9)

你几乎做得对。唯一的小错误是urlencode更喜欢使用加号来表示空格,这仅适用于查询参数而不适用于路径部分。 rawurlencode在这里会更好。

但是,这不是它不起作用的原因。您已经在生成路径/controller/action/par1/%2F,这是正确的。

它在实践中不起作用,因为Apache试图以目录遍历问题保护您(以相当无效的方式)。如果在URL路径中包含%2F序列,Apache默认会跳转并显示您自己的404页面(忽略任何错误文档设置)。要关闭此功能(IMO:misfeature),您可以使用AllowEncodedSlashes配置指令。

当你回到脚本时是否可以实际检索编码的斜杠是另一种蠕虫。由于原始CGI规范中PATH_INFO变量设计不当,许多环境将无法看到%2F与未编码的/有任何不同,可能会破坏路由你是从路径部分做的。

通常最好避免在路径部分使用斜杠,因为Apache不是唯一会被它们搞糊涂的服务器或语言。通常,您应该使用查询参数进行输入,您需要能够接受任何字节或字符串,因为路径部分在许多服务器中存在实际问题(a)/,(b){{1} },(c)NUL字符和(d)空字符串。

答案 1 :(得分:2)

试试%2F。我认为urlencode不会编码'/',因为它是有效的网址语法。

[编辑]:赞赏投票,但似乎我的答案不正确。请参阅以上下面的bobince正确(并且更详细)的答案

答案 2 :(得分:1)

请参阅rawurlencode