2011-08-31 55 views
4

我想创建一个用于添加书签的书签。因此,您只需点击书签中的Bookmark this Page JavaScript代码段,即可将其重定向到页面。如何将URL编码为CakePHP参数

这是我目前的书签:

"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)行动。

我在做什么错?

回答

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

不知道,但希望它有助于 你应该将这个字符串添加到YOUT routs.php

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

后,您的网站将能够读取URL这样

http://site.com/crazycontroller/crazyaction/crazyparams/http://crazy.com 
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编码的网址安全。现在只需要在服务器端反转这两个替换和Base64解码。这样你就不会混淆你的URL控制器与斜杠...

+0

这工作。但是如果你不用任何东西来替换,'='会发生什么。不需要吗? –

+0

它不适用于IE8。 –

+0

'='是填充,并非严格需要。请查看[此处](http://en.wikipedia.org/wiki/Base64#Padding)以获取有关填充的说明。 PHP可以解码Base64而无需填充。 – poplitea