如何将 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