Как кодировать URL как параметр CakePHP - PullRequest
4 голосов
/ 31 августа 2011

Я хотел бы создать букмарклет для добавления закладок.Итак, вы просто нажимаете на Bookmark this Page фрагмент JavaScript в своих закладках, и вы перенаправлены на страницу.

Это мой текущий букмарклет:

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

Это дает мне URL-адрес, подобный этомукогда я нажимаю на него на странице Bookmarklet:

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 голосов
/ 31 августа 2011

У меня была похожая проблема, и я пробовал разные решения, но меня смутило сотрудничество между CakePHP и моим Apache-config.

Моим решением было закодировать URL в Base64 с помощью JavaScript в браузере перед отправкой запроса на сервер.

Ваш букмарклет может выглядеть так:

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

Я делаю две замены здесь, чтобы сделать URL-кодировку Base64 безопасной. Теперь нужно только поменять эти две замены и декодировать Base64 на стороне сервера. Таким образом, вы не перепутаете свой URL-контроллер с косыми чертами ...

2 голосов
/ 31 августа 2011

Основываясь на ответе 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 голосов
/ 31 августа 2011

Не уверен, но надеюсь, что это поможет Вы должны добавить эту строку в yout routs.php

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

и после этого ваш сайт сможет читать URL-адрес вот так

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