Карта сайта Кодировка Горе - PullRequest
1 голос
/ 21 июня 2010

У меня действительно возникают проблемы с пониманием спецификации и рекомендаций о том, как правильно экранировать и кодировать URL-адрес для отправки в карту сайта.

В примерах sitemap.org (выход из сущности) они имеют URL-адрес примера:

http://www.example.com/ümlat.php&q=name

Который, когда кодированный UTF-8 заканчивается как (в соответствии с ними):

http://www.example.com/%C3%BCmlat.php&q=name

Однако, когда я пытаюсь это (rawurlencode) на PHP, я получаю:

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 Ответ

3 голосов
/ 21 июня 2010

Проблема в том, что http://www.example.com/ümlat.php&q=name не является действительным URL-адресом.

(источник: 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 или escape-последовательности (например, %A0 или, что эквивалентно,%a0) необходимо убежать.Символ ? может появляться не более одного раза.Символ / может появляться в части пути, но не в строке запроса.Соглашение для кодирования других символов состоит в том, чтобы вычислить их представление UTF-8 и избежать этой последовательности.

Ваш алгоритм должен (при условии, что хост-часть не является проблемой ...):

  • извлекать часть пути
  • извлекать часть строки запроса
  • для каждого из них, искать недопустимые символы
  • кодировать эти символы в UTF-8
  • передать результат в rawurlencode
  • заменить символ в URL на результат rawurlencode
...