Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 将URL编码的URL作为参数传递给CakePHP上的控制器/操作_String_Cakephp_Urlencode_Param - Fatal编程技术网

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

String 将URL编码的URL作为参数传递给CakePHP上的控制器/操作,string,cakephp,urlencode,param,String,Cakephp,Urlencode,Param,我对CakePHP相当陌生,正因为如此,我曾经用Zend框架做过一些基本的事情,我被Cake打败了 我正在处理一个项目,在这个项目中,我必须向控制器/操作传递一个命名参数。设置路由和传递参数相当简单,我的问题是当参数是url编码的url时 例如:无论控制器和动作设置如何,都将抛出404,但传递/controller/action/http://www.google.com 在某种程度上,唯一的问题是它将http标识为命名参数。换句话说,如果我执行/controller/action?url=ht

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

我正在处理一个项目,在这个项目中,我必须向控制器/操作传递一个命名参数。设置路由和传递参数相当简单,我的问题是当参数是url编码的url时

例如:无论控制器和动作设置如何,都将抛出404,但传递/controller/action/http://www.google.com 在某种程度上,唯一的问题是它将http标识为命名参数。换句话说,如果我执行/controller/action?url=http://www.google.com 它会起作用的

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

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


提前感谢大家。

我已经添加了一项关于此问题的工作。上一个指向帖子的答案实际上回答了它发生的原因和解决方案之一。Apache上.htaccess的解决方案有点危险,因为它会禁用安全标准

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

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

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

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

    显然,您可以使用
    **
    创建自定义路由,该路由将禁用默认URL解码。解决问题

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

    然后默认情况下,Cakephp对URL进行解码,这很好。但它能做到两次?如果存在
    /
    ,使其拆分参数。这不好

    因此,在我的routes.php中,我添加了:

    $builder->connect('/orders/callback/**',['controller'=>'orders','action'=>'callback']);
    
    这有点让人恼火,但它现在起作用了。在4.x中效果很好,花了我整个下午的时间。把这个留在这里,以防其他人有这个问题。(还有未来的我)


    资料来源:

    也许值得一看这些问题的答案。