【问题标题】:How to encode a URL as a CakePHP parameter如何将 URL 编码为 CakePHP 参数
【发布时间】:2023-03-10 10:03:01
【问题描述】:

我想创建一个书签来添加书签。因此,您只需单击书签中的 Bookmark this Page JavaScript 片段,您就会被重定向到该页面。

这是我目前的书签:

"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) 操作的参数。

我做错了什么?

【问题讨论】:

    标签: php javascript cakephp url-rewriting bookmarklet


    【解决方案1】:

    我也遇到过类似的问题,尝试了不同的解决方案,结果被 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 控制器与斜杠混淆...

    【讨论】:

    • 这行得通。但是如果你不用任何东西替换它,= 会发生什么。不需要吗?
    • =是填充,并不是严格需要的。检查 here 以了解填充的说明。 PHP 可以在没有填充的情况下解码 Base64。
    • 嗯,可惜... IE8不支持window.btoa(s)函数。对不起。
    【解决方案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);
    

    我不确定像 ? 这样的字符会发生什么......

    【讨论】:

      【解决方案3】:

      不确定,但希望对您有所帮助 您应该将此字符串添加到 yout routs.php

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

      之后您的网站将能够读取这样的网址

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

      【讨论】:

        猜你喜欢
        • 2011-12-29
        • 2018-08-17
        • 2016-05-11
        • 2011-02-09
        • 2012-07-22
        • 2023-04-06
        • 2021-03-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多