5

我对 CakePHP 还很陌生,正因为如此,我曾经用 Zend 框架做的一些基本的事情我被 Cake 打败了。

我正在开发一个项目,我必须将命名参数传递给控制器​​/操作。设置路由和传递参数相当简单,我的问题是当参数是 urlencoded url 时。

例如: http: //www.cakephp.com/controller/action/http%3A%2F%2Fwww.google.com不管控制器和动作设置如何,都会抛出404,但是通过/controller/action/http: //www.google.com 以某种方式工作,唯一的问题是它将 http 标识为命名参数。以另一种方式,如果我这样做 /controller/action?url=http://www.google.com 它将起作用。

我为此使用的解决方法是将值作为 base64 编码的字符串传递,但它带来了一些限制。例如,如果它是一个 API,则无法保证使用该 API 的系统可以将 base64 编码为字符串。

无论如何,最好的解决方案仍然是将 url 编码的字符串传递给命名参数。问题是,为什么 CakePHP 不接受 urlencoded 字符串作为参数,为什么会抛出 404?

提前谢谢大家。

4

2 回答 2

5

我添加了解决此问题的工作。指向帖子的先前答案实际上回答了它发生的原因和解决方案之一。发生的情况是 .htaccess 在 Apache 上的解决方法有点危险,因为它会禁用安全标准。

有两种方法可以通过代码解决这个问题(我同时使用这两种方法):

  1. 将所有 url 作为 base64 编码字符串发送
  2. 接受 URL 作为命名参数,但是,正如您将注意到的,它将任何 http:// 转换为 http://,因此有必要正确识别何时发生这种情况,然后才更正字符串。

它远不是一个漂亮的解决方案,但它绝对是一个实用的解决方案。

于 2011-01-21T21:22:21.480 回答
0

我在 Cakephp 4.x 中偶然发现了同样的问题

显然,您可以创建一个自定义路由,**该路由将禁用默认的 urldecoding。解决问题。

所以现在我将一个base64_encode(Security::encrypt($val))值放入Router::url()函数中。默认情况下,这将对参数进行 url_encode,使其成为有效/工作的 url。

Cakephp 然后默认 urldecodes,这很好。但它做了两次?如果有/礼物,则使其分裂参数。这不好。

所以在我的 routes.php 中我添加了:

$builder->connect('/orders/callback/**', ['controller' => 'orders', 'action' => 'callback']);

这有点烦人,但现在可以了。像 4.x 中的魅力一样工作,花了我整个下午。把这个留在这里,以防其他人有这个问题。(以及未来的我)。

来源:https ://github.com/cakephp/cakephp/issues/4723#issuecomment-56912905

于 2021-01-05T15:00:42.790 回答