如何在Javascript中编码URL的句点?

时间:2011-02-08 21:51:27

标签: javascript html ruby-on-rails encoding

下面的SO帖子是全面的,但所描述的所有三种方法都无法编码​​。

发布:Encode URL in JavaScript?

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

所以“food.store”以“food.store”形式出现,它打破了URL。它会中断URL,因为Rails应用程序无法将URL识别为有效并显示404错误页面。也许这是Rails路由文件中的配置错误?

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

9 个答案:

答案 0 :(得分:57)

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

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

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

无论如何,我只需在URL中添加一个尾部斜杠就可以解决这个问题。只要把它扔到那里以防它对任何人都有用。

约翰

答案 1 :(得分:30)

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

您可以对数据进行base64编码,但我不相信在js中有一种本机方式可以做到这一点。您还可以在客户端和服务器端使用ASCII等效项(%2E)替换所有句点。

基本上,通常不需要编码'。',所以如果你需要这样做,你需要提出自己的解决方案。您可能还想进一步测试以确保'。'实际上会打破网址。

hth

答案 2 :(得分:8)

我遇到了同样的问题,我的.htaccess打破了输入值。 因为我不想改变.htaccess所做的事情,所以我用它来修复它:

Swift2

然后替换所有标准编码。与ascii等效%2E。 PHP自动转换回。在$ _REQUEST值中,但.htaccess并没有将其视为一个句号,所以事情都很好。

答案 3 :(得分:7)

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

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

答案 4 :(得分:3)

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

在我的情况下,网址是使用javascript生成的。句点用于分隔网址(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

答案 5 :(得分:1)

如果使用.htaccess文件可以使它真的很酷很容易。只需在句号之前添加一个\。类似于:\.

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

无论如何您都不应该使用 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 网络文档:encodeURIComponent()。)只需重写它以添加一个句点,你就可以了:

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

console.log(fixedEncodeURIComponent('hello.'));