Как обслуживать имена файлов 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 недействительным.

Другие вопросы по тегам