Answers:
引用RFC 3986的 2.3节:
“在URI中允许但没有保留用途的字符称为未保留字符。这些字符包括大写和小写字母,十进制数字,连字符,句点,下划线和波浪号。”
ALPHA DIGIT "-" / "." / "_" / "~"
请注意,RFC 3986列出的保留标点符号比旧版RFC 2396少。
ç
和õ
?
post-title-with-%C3%A7-and-%C3%B5
,但仍会在用户的位置栏中显示为post-title-with-ç-and-õ
。
您需要注意两组字符:保留和不安全。
该保留的字符是:
通常认为不安全的字符是:
我可能忘记了一个或多个,这导致我回荡了卡尔五世的回答。从长远来看,最好使用允许字符的“白名单”,然后对字符串进行编码,而不是尝试与服务器和系统不允许的字符保持同步。
#
是保留的字符,用于特定页面上的书签,通过使一个HTML元素具有匹配的name-attribute或id-attribute(sans- #
symbol)来创建。
~
是不安全的。你确定是吗?
最好只保留一些字符(白名单),而不要删除某些字符(黑名单)。
从技术上讲,只要您正确编码,就可以允许任何字符。但是,为回答问题的实质,您只应允许使用以下字符:
其他所有内容都有潜在的特殊含义。例如,您可能认为可以使用+,但是可以将其替换为空格。&也很危险,尤其是在使用某些重写规则的情况下。
与其他评论一样,请查看标准和规格以获取完整的详细信息。
这些是安全的(理论上/规格上),基本上除了域名之外的任何地方。
对未列出的任何内容进行百分比编码,您可以开始使用。
A-Z a-z 0-9 - . _ ~ ( ) ' ! * : @ , ;
仅在特定的URL组件中使用时才安全;小心使用。
Paths: + & =
Queries: ? /
Fragments: ? / # + & =
根据URI规范(RFC 3986),所有其他字符必须进行百分比编码。这包括:
<space> <control-characters> <extended-ascii> <unicode>
% < > [ ] { } | \ ^
如果要考虑最大兼容性,请将字符集限制为AZ az 0-9-_。
(仅对文件扩展名使用句点)。
即使根据规范有效,根据上下文,URL仍然可能是“不安全的”。例如,包含无效文件名字符的file:/// URL,或者在不用作分隔符时,包含“?”,“ =“和“&”的查询组件。正确处理这些情况通常取决于您的脚本,并且可以解决,但这是需要牢记的。
params.toString() // "key=730d67"
”(3)PHP手册,http-build-query:“生成URL编码的查询字符串。[...]上面的示例将输出:0=foo&1=bar[...]
“(4)J. Starr,易腐出版社:“构建网页时,通常需要添加需要参数化查询字符串的链接。”
查看RFC3986-统一资源标识符(URI):通用语法,您的问题围绕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 =保留/ pct编码/ sub-delims /“:” /“ @”
分解为:
ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded
"!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
":" / "@"
或者换句话说:你可以使用任何(非控制- )字符从ASCII表中,除外 /
,?
,#
,[
和]
。
RFC1738-统一资源定位符(URL)支持这种理解。
-
并且;
很安全,这就是我的答案和RFC明确指出的内容。
未保留= ALPHA / DIGIT /“-” /“。/“ _” /“〜”
从您描述的上下文中,我怀疑您实际上要制作的是所谓的“ SEO子弹”。这些最佳的最佳实践是:
因此,举例来说,一篇标题为“!@%$ *表示在漫画中发誓的用法”的文章将获得“用法-代表-发誓的漫画”字样。
我遇到了类似的问题,我想拥有漂亮的网址,并得出结论,我必须在网址中仅允许使用字母,数字,-和_。很好,然后我写了一些不错的正则表达式,我意识到它可以识别所有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 "-";
}
}
当我通过ajax / php将值返回到某个网址,然后该页面再次读取该网址时,我发现将我的网址编码为一个安全的网址非常有用。
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进行编码,以使其在网络上使用“安全”:
这是一个参考。如果您不需要任何特殊字符,只需删除任何需要URL编码的字符: