Декодирование URL не работает должным образом

Мой браузер показывает URL с именем файла как

http://www.example.com/pdf/204177_20090604_Chloorhexidine_DCB_oogdruppels_0%2C1%25.pdf

Фактическое имя файла 204160_20090604_Atropine_DCB_oogdruppels_0,5%.pdf

После urldecode он дает неправильное имя файла как http://www.example.com/pdf/204177_20090604_Chloorhexidine_DCB_oogdruppels_0,1%.pdf

Обновление:

Первоначально я думал, что это проблема декодирования URL-адресов, но файлы с именем 204153_20090605_Aluminiumacetotartraat_DCB_oordruppels_1,2%.pdf при рендеринге в браузере выдают неверный запрос. Я использую фреймворк Kohana 3. Это связано с сервером?


person Asif Mulla    schedule 21.10.2010    source источник
comment
Это должно быть 0%2C5%25 с 5 вместо 1.   -  person Gumbo    schedule 21.10.2010
comment
Указанный вами URL-адрес на самом деле говорит 0,1%, а не 0,5%.   -  person Spudley    schedule 21.10.2010


Ответы (3)


$url = 'http://204160_20090604_Atropine_DCB_oogdruppels_0,5%.pdf';
$encode = urlencode($url);
$decode = urldecode($encode);

echo $url."<br />";
echo $encode."<br />";
echo $decode."<br />";

// outputs
http://204160_20090604_Atropine_DCB_oogdruppels_0,5%.pdf
http%3A%2F%2F204160_20090604_Atropine_DCB_oogdruppels_0%2C5%25.pdf
http://204160_20090604_Atropine_DCB_oogdruppels_0,5%.pdf

Все в порядке. Ваша ошибка где-то в другом месте.

person Frankie    schedule 21.10.2010
comment
Да, вы правы, я тоже проверял. работает, как и ожидалось, как показано в коде выше. Возможно проблема в каком-то сервере. Так ли это? - person Asif Mulla; 21.10.2010
comment
@Asif, судя по вашему описанию, я бы, наверное, сказал, что это как-то связано с тем, как Кохана обрабатывает URL-адреса. Я не могу быть уверен, потому что я никогда не использовал его, но CI (Kohana основана на CI) имеет свои настройки. Вероятно, вам следует отладить основной файл index.php до того, как будут вызваны контроллеры и очистители. - person Frankie; 21.10.2010
comment
@ Фрэнки: я пытался отладить index.php. Но после нажатия на ссылку ни один запрос не отправляется в index.php или его класс обработчика запросов. Не могли бы вы дать мне ссылку, связанную с CI, где мы можем настроить запрос? - person Asif Mulla; 22.10.2010
comment
@Asif на index.php просто (сразу после начального <?php) echo "testing"; exit();, и теперь вы точно узнаете, над каким файлом нужно работать или нет. Если это так, попробуйте посмотреть, сможете ли вы получить/вывести правильные URL-адреса. Только после этого вы будете охотиться внутри Коханы. Это просто чтобы убедиться, что все работает хорошо. - person Frankie; 22.10.2010
comment
@ Фрэнки: это касается не только индекса Коханы. До этого только он выдает плохой запрос. До сих пор я обнаружил, что мы должны правильно настроить правило htaccess, чтобы избежать знака% - person Asif Mulla; 22.10.2010
comment
@ Асиф извини, но я не мог понять твой последний комментарий. Ты где? - person Frankie; 22.10.2010
comment
@Frankie: Спасибо за вашу помощь. Я обнаружил, что ошибки 400-Bad Request не могут быть исправлены в .htaccess, потому что эти запросы отклоняются до того, как сервер выполнит какие-либо файлы конфигурации. Сервер говорит, что этот запрос недействителен, и я вообще не могу его обработать. - person Asif Mulla; 25.10.2010
comment
@Frankie: Вы не сможете использовать буквальный символ % в пути к файлу, потому что этот символ зарезервирован для экранирования всех других символов в URL-адресах. Поскольку для URL-адреса может потребоваться многократное экранирование при его прохождении через различные прокси и серверы между клиентом и конечным сервером, который фактически будет обслуживать запрос, сам символ % не может быть экранирован. - person Asif Mulla; 25.10.2010
comment
@Asif, % - это URL-адрес, экранированный как %25. Что касается кода ошибки HTTP 400, это новая информация, и вам, вероятно, следует опубликовать новый вопрос об этом. - person Frankie; 25.10.2010
comment
@Frankie: Да, я опубликовал отдельный вопрос, как только узнал об этом " title="http 400 неверный запрос при загрузке файла"> stackoverflow.com/questions/3988028/ - person Asif Mulla; 25.10.2010

Вы просматриваете два разных файла.

Невозможно urlencode 204160_20090604_Atropine_DCB_oogdruppels_ в 204177_20090604_Chloorhexidine_DCB_oogdruppels_, кодировка не меняет буквенные символы.

Ошибка скорее всего в коде, который создает список файлов и выводит ссылки; сопоставление между заголовками ссылок и именами файлов кажется перепутанным.

person Saul    schedule 21.10.2010
comment
Хорошо подмечено. Но это скорее комментарий. - person Gumbo; 21.10.2010

это даст вам точное имя файла m, используя С#

Server.UrlDecode("http://www.example.com/pdf/204160_20090604_Atropine_DCB_oogdruppels_0,5%25.pdf")

, (запятая) кодируется как %2c % (процент) кодируется браузерами как %25

если вы используете Request.Url, он будет декодировать (запятая), но не % (процент)

Таким образом, Server.UrlDecode("xyz") декодирует все символы, кроме %(percent), т.е. в приведенном выше имени файла есть "%25"

person FosterZ    schedule 21.10.2010