下面的SO帖子是全面的,但所描述的所有三种方法都无法编码。
例如,如果我运行三种方法(即escape,encodeURI,encodeURIComponent),它们都不会编码句点。
所以“food.store”以“food.store”形式出现,它打破了URL。它会中断URL,因为Rails应用程序无法将URL识别为有效并显示404错误页面。也许这是Rails路由文件中的配置错误?
使用Javascript为网址编码句点的最佳方法是什么?
答案 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.'));