网站地图编码困境

时间:2010-06-20 23:28:27

标签: php xml encoding sitemap

我很难理解有关如何正确转义和编码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

1 个答案:

答案 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表示并转义该序列。

你的算法应该(假设主机部分不是问题......):

  • 提取路径部分
  • 提取查询字符串部分
  • 为每一个,寻找无效字符
  • 以UTF-8
  • 编码这些字符
  • 将结果传递给rawurlencode
  • 使用rawurlencode
  • 的结果替换网址中的字符