如何对“.”进行编码以在 URL 路径中使用

How to encode ".." for use in a URL path?

本文关键字:URL 路径 编码      更新时间:2023-09-26

我正在尝试构建一个如下所示的URL:

var myUrl = '/path/to/api/' + encodeURIComponent(str);

但是,如果str ..那么您的浏览器会自动删除路径段,以便URL变得/path/to这不是我想要的。

我尝试将..编码为%2E%2E但您的浏览器仍然在发送请求之前重新解释它。我能做些什么来让路径实际通过我的服务器作为/path/to/api/..

我认为

这不受支持,因为该行为会违反 RFC 3986。

来自第 2.3 节。 未保留的字符(强调我的):

URI 中允许但没有保留的字符目的被称为无保留。 这些包括大写和小写字母、十进制数字、连字符、句点、下划线和波浪号。

 unreserved  = ALPHA / DIGIT / "-" / "." / "_" / "~"

将非保留字符替换为其对应的百分比编码 US-ASCII 八位字节是等效的:它们标识相同的资源。 但是,URI 比较实现在比较之前,不要总是执行规范化(参见部分6). 为了保持一致性,在 ALPHA 范围内使用百分比编码的八位字节(%41-%5A 和 %61-%7A)、数字 (%30-%39)、连字符 (%2D)、句点 (%2E)、下划线 (%5F) 或波浪号 (%7E) 不应由 URI 创建生产者,当在 URI 中找到时,应解码为其URI 规范化程序的相应非保留字符

来自第 6.2.2.3 节。 路径段规范化(强调我的):

完整的路径段 "." 和 ".."仅供使用在相对引用中(第 4.1 节),并作为引用解析过程(第 5.2 节)。 但是,一些部署的实现错误地假定引用分辨率当引用已经是 URI 时,不需要,因此无法删除出现在非相对路径中的点段。 乌里规范化器应通过应用remove_dot_segments路径的算法,如中所述第 5.2.4.节):

我实际上已经通过对文本进行双重编码,然后在服务器后端对其进行取消编码来做类似的工作。但是,我的是查询参数,而不是路径的一部分。

附言。这是我写在我的手机上的,我稍后会添加一个示例。

由于没有解决方案,除了错误之外,我们无能为力:

export function encodeUriComponent(str) {
    if(str === '.' || str === '..') {
        throw new Error(`Cannot URI-encode "${str}" per RFC 3986 §6.2.2.3`)
    }
    return encodeURIComponent(str);
}

我觉得这是一个比任意修改 URL 路径更好的选择,这正是我试图通过使用 encodeURIComponent 来避免的。