我很难理解有关如何正确转义和编码URL以在站点地图中提交的规范和指南。
在sitemap.org(实体转义)示例中,他们有一个示例网址:
http://www.example.com/ümlat.php&q=name
当UTF-8编码结束时(根据它们):
http://www.example.com/%C3%BCmlat.php&q=name
然而,当我在PHP上尝试这个(rawurlencode)时,我最终得到:
http%3A%2F%2Fwww.example.com%2F%C3%BCmlat.php%26q%3Dname
通过使用PHP.net
上的此功能,我有点打败了这个$entities = array('%21', '%2A', '%27', '%28', '%29', '%3B', '%3A', '%40',
'%26', '%3D', '%2B', '%24', '%2C', '%2F', '%3F', '%23', '%5B', '%5D');
$replacements = array('!', '*', "'", "(", ")", ";", ":", "@", "&", "=", "+",
"$", ",", "/", "?", "#", "[", "]");
$string = str_replace($entities, $replacements, rawurlencode($string));
但根据我采访过的人(Kohana BDFM),这种解释是错误的。老实说,我很困惑,我甚至不知道什么是对的。
对在站点地图中使用的URL进行编码的正确方法是什么?
相关RFC 3986
答案 0 :(得分:3)
问题是http://www.example.com/ümlat.php&q=name
不是有效的网址。
(来源:RFC 1738,这已经过时了但是在这里起作用,RFC 3986确实允许更多的字符,但是通过转义不需要转义的字符不会造成任何伤害)
httpurl = "http://" hostport [ "/" hpath [ "?" search ]] hpath = hsegment *[ "/" hsegment ] hsegment = *[ uchar | ";" | ":" | "@" | "&" | "=" ] uchar = unreserved | escape unreserved = alpha | digit | safe | extra safe = "$" | "-" | "_" | "." | "+" extra = "!" | "*" | "'" | "(" | ")" | "," escape = "%" hex hex search = *[ uchar | ";" | ":" | "@" | "&" | "=" ]
因此,必须转义除;:@&=$-_.+!*'(),
,0-9a-zA-Z
字符或转义序列(例如%A0
或等效地%a0
)之外的任何字符。 ?
字符最多只能出现一次。 /
字符可以出现在路径部分中,但不出现在查询字符串中。编码其他字符的惯例是计算它们的UTF-8表示并转义该序列。
你的算法应该(假设主机部分不是问题......):
rawurlencode
rawurlencode