如何将 URL 编码为 CakePHP 参数

Posted

技术标签:

【中文标题】如何将 URL 编码为 CakePHP 参数【英文标题】:How to encode a URL as a CakePHP parameter 【发布时间】:2011-11-07 12:43:19 【问题描述】:

我想创建一个书签来添加书签。因此,您只需单击书签中的 Bookmark this Page javascript 片段,您就会被重定向到该页面。

这是我目前的书签:

"javascript: location.href='http://…/bookmarks/add/'+encodeURIComponent(document.URL);"

当我在书签页面上单击它时,这会给我一个这样的 URL:

http://localhost/~mu/cakemarks/bookmarks/add/http%3A%2F%2Flocalhost%2F~mu%2Fcakemarks%2Fpages%2Fbookmarklet

服务器不喜欢这样:

The requested URL /~mu/cakemarks/bookmarks/add/http://localhost/~mu/cakemarks/pages/bookmarklet was not found on this server.

这给出了预期的结果,但对我的用例来说毫无用处:

http://localhost/~mu/cakemarks/bookmarks/add/test-string

正在进行Cakephp 典型的mod_rewrite,它应该将最后一部分转换为我的BookmarksController::add($url = null) 操作的参数。

我做错了什么?

【问题讨论】:

【参考方案1】:

我也遇到过类似的问题,尝试了不同的解决方案,结果被 CakePHP 和我的 Apache-config 的配合搞糊涂了。

我的解决方案是在将请求发送到服务器之前,在浏览器中使用 JavaScript 对 Base64 中的 URL 进行编码。

您的书签可能如下所示:

javascript:(function()function myb64enc(s)s=window.btoa(s);s=s.replace(/=/g, '');s=s.replace(/\+/g, '-');s=s.replace(/\//g, '_');return s; window.open('http://…/bookmarks/add/'+myb64enc(window.location));)()

我在这里做了两个替换以使 Base64 编码 URL 安全。现在只是在服务器端反转这两个替换和 Base64 解码。这样您就不会将 URL 控制器与斜杠混淆...

【讨论】:

这行得通。但是如果你不用任何东西替换它,= 会发生什么。不需要吗? =是填充,并不是严格需要的。检查 here 以了解填充的说明。 PHP 可以在没有填充的情况下解码 Base64。 嗯,可惜... IE8不支持window.btoa(s)函数。对不起。【参考方案2】:

根据 poplitea 的回答,我手动翻译麻烦的字符 /:,这样我就没有任何特殊功能。

function esc(s) 
    s=s.replace(/\//g, '__slash__');
    s=s.replace(/:/g, '__colon__');
    s=s.replace(/#/g, '__hash__');
    return s;

在 PHP 中,我很容易将其转换回来。

$url = str_replace("__slash__", "/", $url);
$url = str_replace("__colon__", ":", $url);
$url = str_replace("__hash__", "#", $url);

我不确定像 ? 这样的字符会发生什么......

【讨论】:

【参考方案3】:

不确定,但希望对您有所帮助 您应该将此字符串添加到 yout routs.php

Router::connect (
  '/crazycontroller/crazyaction/crazyparams/*',
  array('controller'=>'somecontroller', 'action'=>'someaction')
);

之后您的网站将能够读取这样的网址

http://site.com/crazycontroller/crazyaction/crazyparams/http://crazy.com

【讨论】:

以上是关于如何将 URL 编码为 CakePHP 参数的主要内容,如果未能解决你的问题,请参考以下文章

ASIHttpRequest - 如何将参数的 NSDictionary 转换为 url 编码的查询参数字符串?

如何在 URL 中设置关键字并希望在 Cakephp 控制器中读取该关键字然后将其设置为查看

Cakephp3:如何在询问标记后使用get参数获取当前页面的完整URL

将老式查询字符串重写为现代 cakephp URL

CakePHP - 如何在更改语言和重新加载路由表后翻译当前 URL

如何使基于类的视图接受来自 URL 的参数或在 URLconf 中硬编码