如何将URL编码为CakePHP参数

时间:2011-08-31 10:57:38

标签: php javascript cakephp url-rewriting bookmarklet

我想创建一个用于添加书签的书签。因此,您只需点击书签中的Bookmark this Page JavaScript代码段,即可重定向到该页面。

这是我目前的书签:

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

当我在Bookmarklet页面上点击它时,这给我一个这样的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)动作的参数。

我做错了什么?

3 个答案:

答案 0 :(得分:2)

我遇到了类似的问题,尝试了不同的解决方案,但却被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控制器与斜杠混淆......

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

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

答案 2 :(得分:0)

不确定,但希望它有所帮助 你应该把这个字符串添加到routes.php

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

之后,您的网站将能够像这样阅读网址

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