Назад | Перейти на главную страницу

Как обслуживать имена файлов HTTP со специальными символами?

В качестве примера возьмем следующую страницу блога:

http://www.roney.com.br/2010/06/20/estados-do-brasil-um-pais-que-precisa-se-unir/

! Осторожно, в него встроено множество YouTube, поэтому загрузка идет медленно! Это бразильская веб-страница, написанная на португальском языке, но размещенная (по словам владельца блога) на веб-хостинге в США.

Интересны ссылки «Pronúncia», где они указывают на имена файлов, содержащие символы не ascii. Взгляните на второй (для Пара): я пишу ссылку на www.roney.com.br/wp-content/uploads/2010/06/par%E1.mp3 (если он не изменит ее из-под меня в будущее :)!))

Как вы видите, он его закодировал, но вы не знаете, как он на самом деле назвал его в своей файловой системе или какая у них конфигурация системы.

Если я щелкну по нему в браузере Firefox, я получу их страницу 404. Он утверждает, что эти ссылки работают для посетителей из Бразилии. Я думал, что это 100% серверная вещь, т.е. либо сервер будет обслуживать его, либо нет. Просто для смеха я установил в своем Firefox предпочтительный язык на португальский, но, как я и подозревал, это не имело никакого значения.

Любой желающий может предложить какое-либо представление о том, как это может работать в Бразилии, но не в США, или о том, что я бы настроил на своей собственной рабочей станции, чтобы они тоже служили мне.

Проблема заключается в кодировке URI. Здесь он кодируется как iso-8859-1 (latin-1) (а затем закодирован в процентах), но RFC 3986 заявляет, что он должен быть закодирован как UTF-8 (а затем закодирован в процентах).

Источник:

Подробнее о процентное кодирование в Википедии.

Настоящий RFC 3986.

Решение:

Чтобы дать вам представление о том, как решить эту проблему, вы можете сделать что-то подобное в PHP.

<?php
echo urlencode(utf8_encode(urldecode('par%E1.mp3')));
?>

Обратите внимание, что если вы поместите весь URI, косые черты (/) также будут закодированы, что сделает URI недействительным.