如何编码“..”用于URL路径?

时间:2016-03-11 18:09:57

标签: javascript urlencode

我正在尝试用以下内容构建一个URL:

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

但如果str..,那么您的浏览器会自动关闭路径段,以使网址变为/path/to,这不是我想要的。

我已尝试将..编码为%2E%2E,但您的浏览器仍会在发送请求之前重新解释它。我可以做些什么让路径实际/path/to/api/..的身份进入我的服务器?

3 个答案:

答案 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来避免的。