2011-08-31 7 views
4

북마크를 추가하기위한 북마크릿을 만들고 싶습니다. 북마크에서 Bookmark this Page 자바 스크립트 스 니펫을 클릭하면 해당 페이지로 리디렉션됩니다.URL을 CakePHP 매개 변수로 인코딩하는 방법

이 내 현재의 북마크입니다 :

http://localhost/~mu/cakemarks/bookmarks/add/http%3A%2F%2Flocalhost%2F~mu%2Fcakemarks%2Fpages%2Fbookmarklet 

을 서버는 ​​아니지만 그런 식으로 수행합니다 :

을 나는 북마크 페이지에 클릭 할 때 나에게이 같은 URL을 제공

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

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

확실하지,하지만 귀하의 사이트가 내가 가진이

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

같은 URL을 수 읽을 것입니다 후

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

routs.php이 행해져 Yout에이 문자열을 추가해야 가 도움이되기를 바랍니다 비슷한 문제, 그리고 다른 해결책을 시도하고, CakePHP와 나의 아파치 설정 사이의 협력에 의해서만 혼란스러워진다.

제 해결책은 서버에 요청을 보내기 전에 브라우저에서 JavaScript로 Base64로 URL을 인코딩하는 것입니다.

귀하의 북마크는 다음과 같이 수 : 나는 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 컨트롤러와 슬래시를 혼동하지 않게됩니다.

+0

이 작동 ... ? 등 같은 문자로 무슨 일 모르겠습니다. 그러나 당신이 그것을 아무것도 대체하지 않는다면'='는 어떻게 될 것입니다. 필요하지 않습니까? –

+0

IE8에서는 작동하지 않습니다. –

+0

'='는 패딩이며 꼭 필요한 것은 아닙니다. 패딩에 대한 설명은 [here] (http://en.wikipedia.org/wiki/Base64#Padding)를 확인하십시오. PHP는 패딩없이 Base64를 디코딩 할 수 있습니다. – poplitea

관련 문제