在Javascript中如何转义双短横线?

4

我有一个Javascript书签,当点击它时,会将用户重定向到新的网页,并将旧网页的URL作为查询字符串的参数提供。

但是,当原始网页的URL中有双连字符时(例如page--1--of--3.html),我遇到了问题。很蠢,我知道 - 我无法控制原始页面。我正在使用的javascript escape函数没有对连字符进行转义,如果要请求resource.aspx?original=page--1--of--3.html,则IIS 6会给出文件未找到的错误。

是否有替代的javascript转义函数可用?解决此问题的最佳方法是什么?有人知道为什么IIS在处理resource.aspx?original=page--1而不是page-1时会出错吗?


你是否检查了服务器日志以查看它正在接收什么请求? - Breton
4个回答

4
"escape"和"unescape"已经被弃用,因为它们不能编码所有相关字符。请勿使用ESCAPE或UNESCAPE,而应改用"encodeURIComponent"和"decodeURIComponent"。这些方法在除了最老旧的浏览器之外的所有浏览器中都得到支持。很遗憾,这种知识并不是很常见。(另请参阅encodeURI和decodeURI)编辑:抱歉,我刚刚测试了一下,这仍然无法覆盖双连字符。

你是对的,抱歉。但是信息的基本要点仍然正确,即使它没有解决目前的问题。 - Breton

2

你能在转义函数中增加一些自定义逻辑来手动编码连字符吗?

resource.aspx?original=page%2d%2d1%2d%2dof%2d%2d3.html

类似这样的:

function customEscape(url) {
    url = escape(url);
    url = url.replace(/-/g, '%2d');
    return url;
}

location.href = customEscape("resource.axd?original=test--page.html");  

更新,针对书签脚本:

<a href="javascript:location.href=escape('resource.axd?original=test--page.html').replace(/-/g, '%2d')">Link</a>

2
我承认这个可以工作,但老实说它没有意义。这将意味着IIS6对URL进行了一些不在规范中的处理(这并不奇怪,但我也从未听说过这种情况)。 - SpliFF
不要尝试编写自己的转义函数,你永远无法覆盖所有边角情况。已经有内置函数处理这些问题了。请查看我的答案以获取更多信息。 - Breton
SpliFF - 我支持你!不过这是在共享主机服务器上 - 我能想到的唯一解释是该公司以某种方式配置了IIS服务器,导致了这种奇怪的副作用。 - ine

1

你做错了其他的事情。"--"在URL和文件名中是合法的。也许这个文件真的找不到了?


我非常确定文件存在并且在那里。只有当双破折号存在时才会出现错误。请记住这是IIS 6,这可能是原因。 - ine
你检查过 resource.aspx 是否因为某些奇怪的原因而剥离了双连字符吗? - SpliFF
是的,非常确定 - 在资源.aspx看到请求之前,服务器就会返回404。 - ine

1

-- 用于注释一些脚本语言。SQL Server使用它来添加注释。您是否使用任何数据库逻辑来存储这些文件名?或者创建任何查询,其中此名称是查询字符串的一部分,而不是使用查询参数?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接