【问题标题】:How do I URL Encode a URL parameter that is itself a URL?如何对本身就是 URL 的 URL 参数进行 URL 编码?
【发布时间】:2011-10-11 21:30:38
【问题描述】:

快速背景 -

我正在对我编写的返回 JSON 响应的服务进行 jQuery ajax 调用。该服务接受网站 URL(即 www.google.com、www.xyz.com/abc123)。请求格式如下:

http://www.mysite.com/[url]

... 其中 [url] 是用户提供的 URL(同样,类似于 www.google.com/abc)

我需要对参数进行 URL 编码,因为 mysite.com/www.google.com 给了我错误。

我的问题是,所有标准的 javascript 编码功能实际上并未对 URL 进行编码。

一个例子:

<html>
<head>
<script>
document.write("encodeURIComponent = " + encodeURIComponent("www.google.com") + "<br />");
document.write("encodeURI = " + encodeURI("www.google.com") + "<br />");
document.write("escape = " + escape("www.google.com"));
</script>
</head>
<body>
</body>

...具有以下输出:

encodeURIComponent = www.google.com
encodeURI = www.google.com
escape = www.google.com

使用 JavaScript/jQuery 实现此目的的正确方法是什么?

我认为这无关紧要,但以防万一,这是一个 Rails 3.0.7 应用程序。

编辑了解更多详情

如果 www.google.com 已经进行了 URL 编码,并且我的 URL (www.mysite.com/www.google.com) 中的句点正常,为什么会出现此错误?

来自 Chrome 开发工具:

GET http://localhost:3000/s/www.google.com 404 (Not Found)

我的 jQuery sn-p:

$.getJSON("http://localhost:3000/s/" + encodeURI($("#txtURL").val()), function(data) {
        alert(data.result.url);
    });

【问题讨论】:

  • 像 id=[url] 那样做会不会更容易
  • http://mysite.com/www.google.com 是一个完全有效的 URL。
  • 请查看我的编辑,为我的问题添加更多细节!
  • re:编辑 - 你得到一个 404,因为它正在寻找一个名为 www.google.com 的目录或文件名

标签: javascript jquery html ruby-on-rails ajax


【解决方案1】:

这是一个完全有效的 URL:

http://mysite.com/s/www.google.com

我怀疑你只是遇到了 Rails format 的东西(即 URL 末尾的 .html 将格式设置为 HTML,.js 用于 JSON,...)所以你只需要修复您的路线以防止格式自动检测妨碍您:

map.connect '/s/:url', :requirements => { :url => /.*/ }, ...

match '/s/:url' => 'pancakes#house', :constraints => { :url => /.*/ }, ...

或您正在使用的任何路由语法。

如果你不告诉 rails :url 应该匹配 /.*/(即任何东西),它会尝试将路由中的句点解释为格式说明符,这将失败并且 Rails 将 404 因为它无法弄清楚如何路由 URL。

【讨论】:

  • 完美!我怀疑的最后一件事似乎总是问题:) 非常感谢您帮助我解决这个问题 - :constraints 成功了
  • @Evan:当您需要在路由中添加电子邮件地址时,请记住这一点,这是我第一次点击它的地方:)
【解决方案2】:

URL 编码会转义在 URL 中具有特殊含义的字符(如 /?)和/或不是 ASCII 字符。 http://mysite.com/www.google.com 是一个完全有效的 URL,没有什么可以转义的。如果你也包含协议,你会得到一些值得转义的字符:

encodeURIComponent('http://www.google.com')
"http%3A%2F%2Fwww.google.com"

如果您的服务器在对http://localhost:3000/s/www.google.com 的请求中出现 404,则表示该 URL 未由服务器处理。不代表网址无效。

【讨论】:

  • 知道了,我认为这可能是我的 Rails 路由在这种情况下的问题 - 感谢您的帮助和洞察力!
【解决方案3】:

正如 mu 所说,点不需要编码。 构建正确 QUERY_STRING 的 jQuery 方法是使用 $.param()

$.param({encodeURIComponent:'http://www.google.de'})

【讨论】:

    猜你喜欢
    • 2021-11-17
    • 1970-01-01
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    • 2013-04-02
    • 2010-09-11
    • 1970-01-01
    • 2013-03-04
    相关资源
    最近更新 更多