友好url的安全字符

我需要做一个网站,将有文章,我想为它做出友好的url,例如页面的URL

标题:文章testing

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

当然,我需要从标题中删除一些字符?# ,但我不知道哪些要删除。

有人能告诉我哪些angular色是安全的吗?

引用RFC 3986的第2.3节:

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

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

请注意,RFC 3986比较旧的RFC 2396列出了更less的预留标点符号。

有两组angular色需要注意: 保留不安全

保留的字符是:

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

一般认为不安全的字符是:

  • 空间 (” ”)
  • 小于和大于(“<>”)
  • 打开和closures括号(“[]”)
  • 打开和closures大括号(“{}”)
  • pipe道(“|”)
  • 反斜杠(“\”)
  • 脱字符(“^”)
  • 百分 (”%”)

我可能已经忘记了一个或多个,这导致我回应卡尔五世的答案。 从长远来看,使用允许字符的“白名单”,然后对string进行编码,而不是试图跟踪服务器和系统不允许的字符,可能会更好。

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

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

  1. 小写字母(将大写字母转换为低字节)
  2. 数字,从0到9
  3. 短划线或下划线_
  4. Tilde〜

其他一切都有潜在的特殊含义。 例如,您可能认为您可以使用+,但可以用空格replace。 &也是危险的,特别是如果使用一些重写规则。

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

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

永远安全

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

  AZ az 0-9 - . _ ~ ( ) ' ! * : @ , ; 

有时安全

在特定的URL组件中使用时才是安全的; 小心使用。

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

从不安全

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

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

如果考虑到最大兼容性,请将字符集限制为AZ az 0-9 – _。
(仅用于文件扩展名)。

从你描述的背景来看,我怀疑你实际上想要做什么就是所谓的“SEO slu </s>”。 对于这些人来说,最好的一般习惯是:

  1. 转换为小写
  2. 将除az和0-9之外的整个字符序列转换为一个连字符( – )(不是下划线)
  3. 从url中删除“停用词”,即“a”,“an”和“the”等不具有意义的索引词。 谷歌停止广泛的名单

所以,举个例子,一篇题为“使用!@%$ *来代表漫画中发誓”的文章会得到一个“使用 – 表示 – 发誓 – 漫画”的slu </s>。

查看RFC3986 – 统一资源标识符(URI):通用语法 ,您的问题围绕着URI的path组件。

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

引用第3.3节,URI segment有效字符的types是pchar

pchar = unreserved / pct-encoded / sub-delims /“:”/“@”

其中分解为:

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

pct-encoded

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

":" / "@"

换句话说:您可以使用ASCII表中的任何(非控制)字符, 除了 / ?#[]

这种理解是由RFC1738 – 统一资源定位符(URL)支持的 。

URI的格式在RFC 3986中定义。 详情请参阅3.3节。

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

我有类似的问题,我想要有漂亮的url,并得出结论,我必须只允许在英文字母,数字和 – 。 这很好,然后我写了一些很好的正则expression式,我意识到,它承认所有的UTF8字符不是在.NET中的字母,并拧紧。 这似乎是一个.NET正则expression式引擎的一个知道的问题。 所以我得到了这个解决scheme:

 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, ie 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 "-"; } } 

我发现它是非常有用的编码我的url到一个安全的时候,我通过Ajax / PHP返回一个值,然后再次被页面读取的URL。

PHP输出与URL编码器的特殊字符&

 //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); 

我想你正在寻找类似于“URL编码”的东西 – 编码一个URL,以便在networking上使用它是“安全的”:

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

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

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