【问题标题】:How to encode periods for URLs in Javascript?如何在 Javascript 中为 URL 编码句点?
【发布时间】:2011-02-08 21:51:26
【问题描述】:

下面的 SO 帖子很全面,但描述的所有三种方法都无法对句点进行编码。

发帖:Encode URL in JavaScript?

例如,如果我运行这三个方法(即 escape、encodeURI、encodeURIComponent),它们都不会对句点进行编码。

因此,“food.store”以“food.store”的形式出现,从而破坏了 URL。它破坏了 URL,因为 Rails 应用程序无法将 URL 识别为有效并显示 404 错误页面。可能是 Rails 路由文件中的配置错误?

用 Javascript 为 URL 编码句点的最佳方法是什么?

【问题讨论】:

  • 它以什么方式破坏了 URL?据我所知,期间不必编码。
  • 谢谢,更新了问题以反映您的问题。
  • 我在您的标签中添加了“ruby-on-rails” - 这不是一般的 URL 问题,而是 Rails 问题或特定于您的应用程序的问题。
  • 转义句点的另一个正当理由是 Apache Sling 中的 url 选择器(由 Day CQ 使用):sling.apache.org/documentation/the-sling-engine/…

标签: javascript html ruby-on-rails encoding


【解决方案1】:

我知道这是一个旧线程,但我在这里没有看到任何导致原始问题的 URL 示例。几天前,我自己在使用 Java 应用程序时遇到了类似的问题。在我的例子中,带有句点的字符串位于 URL 的路径元素的末尾,例如。

http://myserver.com/app/servlet/test.string

在这种情况下,我使用的 Spring 库只是将该字符串的“测试”部分传递给我的控制器类的相关注释方法参数,大概是因为它将“.string”视为文件扩展并将其剥离。也许这与上面的原始问题是相同的潜在问题?

无论如何,我可以通过在 URL 中添加一个斜杠来解决这个问题。只是把它扔在那里,以防它对其他人有用。

约翰

【讨论】:

  • 谢谢你!我正在使用 .NET WebApi2 解决这个问题。我刚刚添加了斜杠,它就被清除了。谢谢!
  • 嗯,这在使用 rails 3.2 时不起作用;尾部的斜线首先被吃掉(在句号之前和后面的“类型”被剥离。有什么想法吗?
  • 不错的一个家伙,这么简单的修复
  • 谢谢。用 express/nodejs 解决了同样的问题。
【解决方案2】:

句号不应该破坏网址,但我不知道你是如何使用句号的,所以我真的不能说。我所知道的所有函数都没有编码“。”对于 url,这意味着您必须使用自己的函数来编码 '.' .

您可以对数据进行 base64 编码,但我认为在 js 中没有本地方法可以做到这一点。您还可以在客户端和服务器端将所有句点替换为对应的 ASCII 码 (%2E)。

基本上,通常不需要对“.”进行编码,因此如果您需要这样做,则需要提出自己的解决方案。您可能还需要进行进一步测试以确保“。”实际上会破坏网址。

【讨论】:

  • @crashalot 我认为您的 Rails 路由配置需要修复。我不是 Rails 人,但 Rails 可能不支持句点。看看这个网址,我相信它解决了你的问题:masonoise.wordpress.com/2010/02/04/…
  • 我找不到我的路线,所以使用了这个 hacky crappy 解决方法:Tag.find_by_name(params[:id] + '.' + params[:format])
  • 是的,您可以使用 atob 和 btoa 在 JavaScript 中使用 base64 进行原生编码。并不是说我会推荐它用于 URL 参数...
  • 其实paypal对return url dot进行了编码。 “website.com”转换为“website%2ecom”。您可以从这里paypal.com/uk/cgi-bin/webscr?cmd=_button-management 进行操作(添加返回网址,不要在paypal 中保存按钮,然后查看链接的电子邮件版本)
【解决方案3】:

我遇到了同样的问题,我的 .htaccess 用 .htaccess 破坏了输入值。 由于我不想更改 .htaccess 所做的事情,所以我用它来修复它:

var val="foo.bar";
var safevalue=encodeURIComponent(val).replace(/\./g, '%2E');

这会执行所有标准编码,然后替换 .有 ascii 等价的 %2E。 PHP 自动转换回 .在 $_REQUEST 值中,但 .htaccess 不将其视为句点,所以一切都很好。

【讨论】:

  • Javascript escape() 也会将 %2E 转换回原来的句点;这是最好、最直接的答案。
  • 对于至少在服务器呈现的页面上以这种方式编码的 URL,浏览器会在您点击链接之前解码编码的句点,因此在许多情况下这并不能解决问题。
【解决方案4】:

句点不必在 URL 中编码。 Here 是要查看的 RFC。

如果一个句点“破坏”了某些东西,可能是您的服务器正在对 URL 进行自己的解释,这当然是一件好事,但这意味着您必须想出一些编码方案当您自己的元字符需要转义时,您自己的。

【讨论】:

  • Sole /./../%2E/%2E%2E 都可以破坏 URL 构造函数,仅使用浏览器 JavaScript。
  • @Polv 正如我在答案中所写,根据服务器的工作方式和/或服务器上的应用程序,一段时间可能错误,但他们不需要进行编码以使 URL 本身在语法上正确。
【解决方案5】:

我也有同样的问题,也许我的解决方案将来可以帮助其他人。

在我的例子中,url 是使用 javascript 生成的。句点用于分隔 url (sling selectors) 中的值,因此选择器本身不允许有句点。

我的解决方案是用 html 实体替换所有句点,就像 图 1

图 1:解决方案

var urlPart = 'foo.bar';
var safeUrlPart = encodeURIComponent(urlPart.replace(/\./g, '.'));

console.log(safeUrlPart); // foo%26%2346%3Bbar
console.log(decodeURIComponent(safeUrlPart)); // foo.bar

【讨论】:

    【解决方案6】:

    如果可能的话,使用 .htaccess 文件会让它变得非常酷和简单。只需在句点前添加一个 \。比如:\.

    【讨论】:

      【解决方案7】:

      我在 rest api url 中遇到了 .s 的问题。事实上,它们被解释为以它自己的方式有意义的扩展。转义无济于事,因为它们在调用之前未转义(如前所述)。添加尾随 / 也无济于事。我通过将值作为命名参数传递来解决这个问题。例如api/Id/Text.string 到 api/Id?arg=Text.string。您需要修改控制器上的路由,但处理程序本身可以保持不变。

      【讨论】:

        【解决方案8】:

        这是一个 Rails 问题,请参阅 Rails REST routing: dots in the resource item ID 以获得解释(和 Rails 路由指南,第 3.2 节)

        【讨论】:

          【解决方案9】:

          无论如何,您不应该使用encodeURI()encodeURIComponent()

          console.log(encodeURIComponent('%^&*'));

          输入:%^&*。输出:%25%5E%26*。因此,需要明确的是,这不会转换 *Hopefully you know this before you run rm * after "cleansing" that input server-side!

          幸运的是,MDN 为我们提供了一种解决方法来解决这个明显的问题,fixedEncodeURI()fixedEncodeURIComponent(),它基于这个正则表达式:[!'()*]。 (来源:MDN Web Docs:encodeURIComponent()。)改写加个句号就可以了:

          function fixedEncodeURIComponent(str) {
           return encodeURIComponent(str).replace(/[\.!'()*]/g, function(c) {
             return '%' + c.charCodeAt(0).toString(16);
           });
          }
          
          console.log(fixedEncodeURIComponent('hello.'));

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-05-02
            • 2022-07-03
            • 2014-12-25
            • 1970-01-01
            相关资源
            最近更新 更多