我正在做一个有文章的网站,我需要文章有“友好”的url,基于标题。

例如,如果我的文章标题是“文章测试”,我希望URL是http://www.example.com/articles/article_test。

但是,文章标题(与任何字符串一样)可以包含多个特殊字符,这些字符不可能直接放在我的URL中。比如说,我知道?或#需要被替换,但我不知道所有其他。

url中允许使用哪些字符?什么东西是安全的?


当前回答

引用RFC 3986第2.3节:

URI中允许的但没有保留的字符 目的,都叫无保留。这包括大写和小写 字母、十进制数字、连字符、句号、下划线和波浪号。 字母数字"-" / "。"/ "_" / "~"

注意,RFC 3986比旧的RFC 2396列出了更少的保留标点符号。

其他回答

我认为你正在寻找类似“URL编码”的东西——对URL进行编码,以便在网络上使用它是“安全的”:

这里有一个参考。如果你不想要任何特殊字符,只需删除任何需要URL编码的字符:

HTML URL编码参考

总是安全的

在理论上和规范上,除了域名之外,这些基本在任何地方都是安全的。对未列出的内容进行百分比编码,就可以开始了。

    A-Z a-z 0-9 - . _ ~ ( ) ' ! * : @ , ;

有时安全

只有在特定URL组件中使用才安全;小心使用。

    Paths:     + & =
    Queries:   ? /
    Fragments: ? / # + & =
    

不安全的

根据URI规范(RFC 3986),所有其他字符必须用百分比编码。这包括:

    <space> <control-characters> <extended-ascii> <unicode>
    % < > [ ] { } | \ ^
    

如果最大兼容性是一个问题,限制字符集为a-z a-z 0-9 - _。(仅对文件名扩展名使用句点)。

牢记语境

即使根据规范有效,URL仍然可能是“不安全的”,这取决于上下文。例如包含无效文件名字符的file:/// URL,或者不用作分隔符时包含“?”、“=”和“&”的查询组件。这些情况的正确处理通常取决于您的脚本,并且可以解决,但这是需要记住的事情。

URI的格式在RFC 3986中定义。详见3.3节。

引用RFC 3986第2.3节:

URI中允许的但没有保留的字符 目的,都叫无保留。这包括大写和小写 字母、十进制数字、连字符、句号、下划线和波浪号。 字母数字"-" / "。"/ "_" / "~"

注意,RFC 3986比旧的RFC 2396列出了更少的保留标点符号。

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