【问题标题】:Passing an urlencoded URL as parameter to a controller / action at CakePHP将 urlencoded URL 作为参数传递给 CakePHP 的控制器/动作
【发布时间】:2011-01-20 18:28:20
【问题描述】:

我是 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?

提前谢谢大家。

【问题讨论】:

    标签: string cakephp urlencode param


    【解决方案1】:

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

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

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

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

    【讨论】:

    【解决方案2】:

    我在 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

    【讨论】:

      猜你喜欢
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多