已解决:
这个 URI 有效:
/controller/action?ret=%2F
我想将一个额外的“/”参数传递给 Controller 操作。所以我这样做了:
$par1 = urlencode('/');
$this->_redirect('/controller/action/par1/' . $par1);
但我收到此错误消息:
Not Found
The requested URL /controller/action/ret// was not found on this server.
当我在没有任何参数或带有参数“aaa”的情况下调用 Controller 操作时,它起作用了。这些 URI 有效:
/controller/action
/controller/action/par1/aaa
/controller/action/par1/jfhsdajkhfui454fs
/controller/action/par1
/controller/action/par1/
你可以把http://example.com在上面所有相对 URI 的前面并且它是相同的。
最佳答案
你几乎做对了。唯一的小错误是 urlencode
更喜欢使用加号来表示空格,这只适用于查询参数而不适用于路径部分。 rawurlencode
在这里会更好。
但是,这不是它不起作用的原因。您已经在生成路径 /controller/action/par1/%2F
,这是正确的。
它实际上对您不起作用,因为 Apache 试图保护您(以一种相当无效的方式)免受目录遍历问题的影响。如果您在 URL 路径中包含 %2F
序列,Apache 将默认跳入并显示您自己的 404 页面(忽略任何 errordocument 设置)。要关闭此功能(IMO:错误功能),您可以使用 AllowEncodedSlashes配置指令。
当编码的斜线返回到您的脚本时,您是否真的可以检索它是另一回事。由于原始 CGI 规范中 PATH_INFO
变量的糟糕设计,许多环境将无法将 %2F
视为与未编码的 有任何不同>/
,可能会破坏您从路径部分执行的路由。
通常最好避免在路径部分使用斜线,因为 Apache 不是唯一会被斜线混淆的服务器或语言。通常,您应该在需要能够接受任何字节或字符的字符串的地方使用查询参数作为输入,因为路径部分在许多服务器中存在实际问题(a)/
,(b)\
,(c) NUL 字符和 (d) 空字符串。
关于php - 如何通过 URI 中的 GET 传递 "/"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2232485/