Как обслуживать имена файлов HTTP со специальными символами?
Возьмите следующую страницу блога в качестве кейса:
http://www.roney.com.br/2010/06/20/estados-do-brasil-um-pais-que-precisa-se-unir/
Осторожно, в него встроены тонны трубок, поэтому и медленная загрузка! Это бразильская веб-страница, написанная на португальском языке, но размещенная (по словам владельца блога) на веб-хостинге в США.
Интерес представляют ссылки "Pronúncia", где они ссылаются на имена файлов, содержащие символы не ascii. Посмотрите на второй (для Пара): ссылка, как я пишу, на www.roney.com.br/wp-content/uploads/2010/06/par%E1.mp3 (если только он не изменит его из-под меня в будущее:)!))
Как вы видите, он закодировал его, но вы не знаете, как он на самом деле назвал его в своей файловой системе или какую конфигурацию системы они имеют.
Если я нажимаю на него в браузере Firefox, я получаю страницу 404 Он утверждает, что эти ссылки работают для бразильских посетителей. Я думал, что это 100% серверная вещь, т.е. либо сервер будет обслуживать его, либо нет. Просто ради смеха я установил предпочитаемый язык португальский в моем Firefox, но, как я и подозревал, это не имело никакого значения.
Любой, кто захочет поделиться какой-либо информацией о том, как это может работать в Бразилии, но не в США, или о том, что я бы настроил на своей рабочей станции, чтобы они тоже служили мне.
1 ответ
Проблема заключается в кодировке URI. Здесь он кодируется как iso-8859-1 (латинский-1) (и затем кодируется в процентах), но RFC 3986 утверждает, что он должен быть закодирован как UTF-8 (и затем кодирован в процентах).
Источник:
Больше информации о процентном кодировании в Википедии.
Фактический RFC 3986.
Решение:
Чтобы дать вам представление о том, как решить эту проблему, вы можете сделать что-то подобное в PHP.
<?php
echo urlencode(utf8_encode(urldecode('par%E1.mp3')));
?>
Обратите внимание, что если вы введете весь URI, косые черты (/) также будут закодированы, что сделает URI недействительным.