Php 我怎样才能通过/&引用;通过进入URI?

Php 我怎样才能通过/&引用;通过进入URI?,php,zend-framework,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 ser

已解决:

此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/

您可以将所有相关URI放在上面,它们是相同的。

尝试
%2F
。我认为
urlencode
不会对
'/'
进行编码,因为它是有效的URL语法


[编辑]:感谢投票,但我的答案似乎不正确。请参见上面bobince的正确(更详细)答案。

请参见

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

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

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

当编码的斜杠返回到脚本时,您是否能够实际检索到它是另一个棘手的问题。由于原始CGI规范中的
PATH\u INFO
变量设计不当,许多环境将无法将
%2F
视为与未编码的
/
不同,从而可能会破坏您正在从路径部分执行的路由


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

我实际上通过使用URI解决了这个问题:/controller/action?ret=%2F:)答案非常翔实,bobince。我自己也不熟悉AllowEncodeSlass配置选项。