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

标签 php zend-framework

已解决:

这个 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/

相关文章:

zend-framework - Zend 框架 : "url not found" only with index controller, 仅当小写

php - Zend_Http_Client 在尝试请求无效 URL 时挂起

php 从数组中打印更多结果并对它们进行分组

php - 添加限制加速 mysql 查询,为什么?

php - 在php中打开com端口

Zend Framework 中的 MySQL 资源

zend-framework - zend 框架连接错误 : could not find driver pdo mysql

php - 为什么我只得到 1 行 ans?

javascript - 在 PHP 代码中调用 HTML 代码

php - Zend 1.12 显示 Twitter 提要