如何将URL编码为CakePHP参数

5
我希望创建一个添加书签的书签插件。因此,您只需在书签中单击Bookmark this PageJavaScript Snippet,即可重定向到该页面。

这是我的当前书签插件:

"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个回答

2

我曾经遇到过类似的问题,尝试了不同的解决方案,但是CakePHP和我的Apache配置之间的协作让我感到困惑。

我的解决方案是在浏览器中使用JavaScript将URL编码为Base64,然后再将请求发送到服务器。

你的书签脚本可以像这样:

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编码更安全。现在只需要反转这两个替换并在服务器端进行Base64解码。这样,您就不会因为斜杠而混淆URL控制器......


这个是有效的。但是如果你不用任何东西来替换 =,那么它会发生什么呢?它不需要吗? - Martin Ueding
=是填充字符,不是必需的。在这里查看关于填充的解释:http://en.wikipedia.org/wiki/Base64#Padding。PHP可以解码没有填充的Base64编码。 - poplitea
哎呀,真遗憾...函数window.btoa(s)不受IE8支持。抱歉。 - poplitea

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);

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


0

不确定,但希望能帮到您,您应该将此字符串添加到您的routs.php文件中

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

然后您的网站将能够读取此类URL

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接