Почему использование CGI :: escape для URL моей ссылки заставляет мой браузер перенести меня в неправильное место? - PullRequest
3 голосов
/ 02 июля 2011

Я использую метод экранирования CGI для экранирования URL-адреса для тега ссылки href.Без вызова escape () ссылка работает нормально в моем браузере, потому что она достаточно умна, чтобы переводить пробелы как часть URL.

Мой скрипт cgi имеет

print $outhtml->a({href=>$outhtml->escape($wavURL)}, $outhtml->escapeHTML($exportFilename));          

где $outhtml - это объект CGI, а URL-адрес wav - http://localhost/downloads/My File.mp3

. С помощью escape можно вывести:

<a href="http%3A%2F%2Flocalhost%2Fdownloads%2FMy%20File.mp3">My File</a>

Это выглядит нормально для меня, но в Chrome это относительная ссылкапоэтому, когда я нажимаю на него или копирую адрес ссылки, он добавляет localhost / cgi-bin, давая неправильный адрес, например, так:

http://localhost/cgi-bin/http%3A%2F%2Flocalhost%2Fdownloads%2FMy%20File.mp3

Я пробовал это без начального 'http://' ва также необработанный URL, и он ведет себя так же плохо.Я также попытался использовать абсолютный URL без имени хоста, например /downloads/My File.mp3, но это также ведет себя так же.Я проверил это на chrome и firefox, и оба получили одинаковый результат.

Я также попробовал URI :: Escape, но он сделал то же самое.

Что я делаю не так?

Ответы [ 3 ]

3 голосов
/ 03 июля 2011

Вы должны экранировать только значения параметров CGI, но не весь URL.Например:

http://localhost/cgi-bin/get_file_by_url.pl?where=http%3A%2F%2Flocalhost%2Fdownloads%2FMy%20File.mp3

Значение where должно быть экранировано.Модуль URI поможет вам.

use URI;
my $myurl = URI->new('http://localhost/downloads/My File.mp3');
print $myurl->as_string, "\n";
# http://localhost/downloads/My%20File.mp3
0 голосов
/ 03 июля 2011

Поскольку escape преобразует любой символ, имеющий специальное значение в URL, он может использоваться в качестве данных.Если вы введете полный URL-адрес, то получите // (два символа косой черты), такие как *1002* (который отделяет схему от хоста).

0 голосов
/ 02 июля 2011

Я бы просто экранировал имя файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...