友好网址的安全字符

时间:2009-03-29 21:42:37

标签: url friendly-url

我需要建立一个有文章的网站,我想为它制作友好的网址,例如

页面的网址
  

标题:文章测试

应该成为:http://www.example.com/articles/article_test

当然,我需要删除标题中的一些字符,例如?#,但我不确定要删除哪些字符。

有人能告诉我哪些角色可以保存?

13 个答案:

答案 0 :(得分:177)

引用RFC 3986的第2.3节:

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

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

请注意,RFC 3986列出的保留标点符号少于旧版RFC 2396

答案 1 :(得分:98)

您需要注意两组字符:保留不安全

保留字符为:

  • &符号(“&”)
  • dollar(“$”)
  • 加号(“+”)
  • 逗号(“,”)
  • 正斜杠(“/”)
  • 冒号(“:”)
  • 分号(“;”)
  • equals(“=”)
  • 问号(“?”)
  • '在'符号(“@”)
  • pound(“#”)。

通常被视为不安全的字符是:

  • space(“”)
  • 小于和大于(“<>”)
  • 打开和关闭括号(“[]”)
  • 打开和关闭大括号(“{}”)
  • pipe(“|”)
  • 反斜杠(“\”)
  • 插入符号(“^”)
  • 百分比(“%”)

我可能已经忘记了一个或多个,这让我回应了Carl V的回答。从长远来看,你可能最好使用允许字符的“白名单”然后编码字符串,而不是试图及时了解服务器和系统不允许的字符。

答案 2 :(得分:38)

最好只保留一些字符(白名单),而不是删除某些字符(黑名单)。

您可以在技术上允许任何角色,只要您正确编码它。但是,要回答问题的精神,你应该只允许这些字符:

  1. 小写字母(将大写字母转换为小写字母)
  2. 数字,0到9
  3. 破折号 - 或下划线_
  4. Tilde~
  5. 其他一切都有潜在的特殊含义。例如,您可能认为可以使用+,但可以用空格替换。 &安培;也是危险的,特别是如果使用一些重写规则。

    与其他评论一样,请查看标准和规格以获取完整的详细信息。

答案 3 :(得分:23)

始终安全

这些是安全的(理论上/规范),基本上除了域名以外的任何地方。
百分比编码未列出的任何内容,你很高兴。

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

有时安全

在特定网址组件中使用时才安全;小心使用。

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

从不安全

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

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

如果需要考虑最大兼容性,请将字符集限制为A-Z a-z 0-9 - _。
(仅限文件扩展名的句号)。

答案 4 :(得分:16)

查看RFC3986 - Uniform Resource Identifier (URI): Generic Syntax,您的问题围绕着URI的路径组件。

    foo://example.com:8042/over/there?name=ferret#nose
     \_/   \______________/\_________/ \_________/ \__/
      |           |            |            |        |
   scheme     authority       path        query   fragment
      |   _____________________|__
     / \ /                        \
     urn:example:animal:ferret:nose

引用第3.3节,URI segment的有效字符属于pchar类型:

  

pchar = unreserved / pct-encoded / sub-delims /&#34;:&#34; /&#34; @&#34;

分解为:

  

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

     

pct-encoded

     

"!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="

     

":" / "@"

或换句话说:您可以使用ASCII table中的任何(非控件)字符,但 /?,{{1 },#[

这种理解得到RFC1738 - Uniform Resource Locators (URL)的支持。

答案 5 :(得分:12)

unreserved = ALPHA / DIGIT /“ - ”/“。” /“_”/“〜”

答案 6 :(得分:11)

从你描述的背景来看,我怀疑你真正想要做的是一种叫做'SEO slug'的东西。最常见的做法是:

  1. 转换为小写
  2. 将除a-z和0-9以外的整个字符序列转换为一个连字符( - )(不是下划线)
  3. 从网址中删除“停用词”,即“a”,“an”和“the”之类的无意义索引词。 Google为广泛的列表“停止使用”
  4. 因此,作为一个例子,一篇题为“使用!@%$ *代表在漫画中咒骂”的文章会得到一个“使用代表 - 咒骂漫画”的大片。

答案 7 :(得分:6)

URI的格式在RFC 3986中定义。有关详细信息,请参阅第3.3节。

答案 8 :(得分:6)

从SEO的角度来看,连字符比下划线更受欢迎。转换为小写,删除所有撇号,然后用单个连字符替换所有非字母数字字符串。在开始和结束时修剪多余的连字符。

答案 9 :(得分:3)

我遇到了类似的问题,我希望得到漂亮的网址,并得出结论,我必须只允许字母,数字, - 和网址中的_。这很好,然后我写了一些很好的正则表达式,我意识到它识别所有UTF8字符不是.NET中的字母而且被搞砸了。这似乎是.NET正则表达式引擎的一个已知问题。所以我得到了这个解决方案:

private static string GetTitleForUrlDisplay(string title)
{
    if (!string.IsNullOrEmpty(title))
    {
        return Regex.Replace(Regex.Replace(title, @"[^A-Za-z0-9_-]", new MatchEvaluator(CharacterTester)).Replace(' ', '-').TrimStart('-').TrimEnd('-'), "[-]+", "-").ToLower();
    }
    return string.Empty;
}


/// <summary>
/// All characters that do not match the patter, will get to this method, i.e. useful for unicode chars, because
/// .NET impl of regext do not handle unicode chars. So we use char.IsLetterOrDigit() which works nicely and we 
/// return what we approve and return - for everything else.
/// </summary>
/// <param name="m"></param>
/// <returns></returns>
private static string CharacterTester(Match m)
{
    string x = m.ToString();
    if (x.Length > 0 && char.IsLetterOrDigit(x[0]))
    {
        return x.ToLower();
    }
    else
    {
        return "-";
    }
}

答案 10 :(得分:1)

当我通过ajax / php将值返回到一个url然后再次被页面读取时,我发现将我的url编码为安全的url非常有用。

带有url编码器的PHP输出,用于特殊字符&amp;

&#13;
&#13;
//PHP returning the sucess info of ajax request
echo "".str_replace('&','%26',$_POST['name'])." category was changed";

//javascript sending the value to url
window.location.href='time.php?return=updated&val='+msg;

//javascript/php executing the function printing the value of the url,
//now with the text normally lost in space because of the reserved & character.

setTimeout("infoApp('updated','<?php echo $_GET['val'];?>');",360);
&#13;
&#13;
&#13;

希望有人发现我的小代码提取有用! :)

答案 11 :(得分:0)

我认为您正在寻找类似“网址编码”的内容 - 对网址进行编码,以便在网络上使用它“安全”:

以下是对此的参考。如果您不想要任何特殊字符,只需删除任何需要URL编码的内容:

http://www.w3schools.com/TAGS/ref_urlencode.asp

答案 12 :(得分:-4)

3-50个字符。可以包含小写字母,数字和特殊字符 - 点(。),短划线( - ),下划线(_)和速率(@)。