我正在尝试用以下内容构建一个URL:
var myUrl = '/path/to/api/' + encodeURIComponent(str);
但如果str
为..
,那么您的浏览器会自动关闭路径段,以使网址变为/path/to
,这不是我想要的。
我已尝试将..
编码为%2E%2E
,但您的浏览器仍会在发送请求之前重新解释它。我可以做些什么让路径实际以/path/to/api/..
的身份进入我的服务器?
答案 0 :(得分:7)
我认为这不受支持,因为行为会违反RFC 3986。
来自Section 2.3. Unreserved Characters(强调我的):
URI中允许但没有保留的字符 目的被称为无保留。这些包括大写和小写 字母,十进制数字,连字符,句号,下划线和波浪号。
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
使用替换未保留字符的URI 其相应的百分比编码的US-ASCII八位字节是等价的:它们 识别相同的资源。但是,URI比较实现 在比较之前不要总是进行标准化(参见章节 6)。 为了保持一致性,ALPHA范围内的百分比编码八位字节 (%41-%5A和%61-%7A),DIGIT(%30-%39),连字符(%2D),期间(%2E), 不应由URI创建下划线(%5F)或波形符(%7E) 生成器,当在URI中找到时,应该被解码为它们的 URI规范化程序对应的未保留字符。
来自Section 6.2.2.3. Path Segment Normalization(强调我的):
完整路径段“。”和“..”仅供使用 在相关参考文献(第4.1节)内,并作为一部分删除 参考决议过程(第5.2节)。但是,有些 部署的实现错误地假设参考解析 当引用已经是URI并且因此失败时,则不是必需的 当它们出现在非相对路径中时,删除点段。 URI normalizers应该通过应用删除点段 remove_dot_segments算法到路径,如中所述 Section 5.2.4.):
答案 1 :(得分:2)
我实际上通过对文本进行双重编码来完成类似的操作,然后在服务器后端取消编码。但是,我的是查询参数,而不是路径的一部分。
PS。这是写在我的手机上,我稍后会添加一个例子。
答案 2 :(得分:1)
看到那里no solution,除了错误之外我们做的不多:
export function encodeUriComponent(str) {
if(str === '.' || str === '..') {
throw new Error(`Cannot URI-encode "${str}" per RFC 3986 §6.2.2.3`)
}
return encodeURIComponent(str);
}
我觉得这是一个比任意修改网址路径更好的选择,这正是我试图通过使用encodeURIComponent
来避免的。