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

Ric*_*nop 7 php zend-framework

解决了:

此URI有效:

/controller/action?ret=%2F
Run Code Online (Sandbox Code Playgroud)

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

$par1 = urlencode('/');
$this->_redirect('/controller/action/par1/' . $par1);
Run Code Online (Sandbox Code Playgroud)

但我收到此错误消息:

Not Found

The requested URL /controller/action/ret// was not found on this server.
Run Code Online (Sandbox Code Playgroud)

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

/controller/action
/controller/action/par1/aaa
/controller/action/par1/jfhsdajkhfui454fs
/controller/action/par1
/controller/action/par1/
Run Code Online (Sandbox Code Playgroud)

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

bob*_*nce 9

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

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

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

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

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