我需要建立一个有文章的网站,我想为它制作友好的网址,例如
页面的网址标题:文章测试
应该成为:http://www.example.com/articles/article_test
。
当然,我需要删除标题中的一些字符,例如?
或#
,但我不确定要删除哪些字符。
有人能告诉我哪些角色可以保存?
答案 0 :(得分:177)
引用RFC 3986的第2.3节:
“URI中允许但没有保留的字符 目的被称为无保留。这些包括大写和小写 字母,十进制数字,连字符,句号,下划线和波浪号。“
ALPHA DIGIT "-" / "." / "_" / "~"
请注意,RFC 3986列出的保留标点符号少于旧版RFC 2396。
答案 1 :(得分:98)
您需要注意两组字符:保留和不安全。
保留字符为:
通常被视为不安全的字符是:
我可能已经忘记了一个或多个,这让我回应了Carl V的回答。从长远来看,你可能最好使用允许字符的“白名单”然后编码字符串,而不是试图及时了解服务器和系统不允许的字符。
答案 2 :(得分:38)
最好只保留一些字符(白名单),而不是删除某些字符(黑名单)。
您可以在技术上允许任何角色,只要您正确编码它。但是,要回答问题的精神,你应该只允许这些字符:
其他一切都有潜在的特殊含义。例如,您可能认为可以使用+,但可以用空格替换。 &安培;也是危险的,特别是如果使用一些重写规则。
与其他评论一样,请查看标准和规格以获取完整的详细信息。
答案 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 },#
和[
。
答案 5 :(得分:12)
unreserved = ALPHA / DIGIT /“ - ”/“。” /“_”/“〜”
答案 6 :(得分:11)
从你描述的背景来看,我怀疑你真正想要做的是一种叫做'SEO slug'的东西。最常见的做法是:
因此,作为一个例子,一篇题为“使用!@%$ *代表在漫画中咒骂”的文章会得到一个“使用代表 - 咒骂漫画”的大片。
答案 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;
//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;
希望有人发现我的小代码提取有用! :)
答案 11 :(得分:0)
我认为您正在寻找类似“网址编码”的内容 - 对网址进行编码,以便在网络上使用它“安全”:
以下是对此的参考。如果您不想要任何特殊字符,只需删除任何需要URL编码的内容:
答案 12 :(得分:-4)
3-50个字符。可以包含小写字母,数字和特殊字符 - 点(。),短划线( - ),下划线(_)和速率(@)。