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之前,它们是相同的.
你几乎做得对.唯一的小错误是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)空字符串.