我想创建一个用于添加书签的书签。因此,您只需点击书签中的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)
动作的参数。
我做错了什么?
答案 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