将urlencoded URL作为参数传递给CakePHP上的控制器/操作

时间:2011-01-20 18:28:21

标签: string cakephp urlencode param

我在CakePHP上相当新,因为有一些基本的东西,我曾经用Zend Framework做的,我用Cake打败了。

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

例如: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?

提前全部谢谢。

2 个答案:

答案 0 :(得分:5)

我已经围绕这个问题添加了一项工作。以前回答的帖子实际上回答了为什么会发生这种情况并解决其中一个问题。发生的事情是Apache上的.htaccess的解决方法有点危险,因为它会禁用安全标准。

有两种方法可以通过代码解决这个问题(我正在使用它们):

  1. 将所有网址发送为base64编码字符串
  2. 接受urls作为命名参数,但是,正如您将注意到的,它将任何http://转换为http:/,因此必须正确识别何时发生这种情况,然后才更正字符串。
  3. 它远非一个美丽的解决方案,但绝对是一个实用的解决方案。

答案 1 :(得分: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