2011-08-31 96 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