解决:
此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的前面,它们是相同的。
答案 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