2011-07-02 30 views
3

我正在使用CGI轉義方法來轉義href鏈接標記的url。 沒有escape()調用,鏈接在我的瀏覽器中正常工作,因爲它足夠聰明,可以將空間翻譯爲URL的一部分。爲什麼我的鏈接URL使用CGI :: escape會讓我的瀏覽器帶我到錯誤的地方?

我的CGI腳本有這個

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

其中$outhtml是一個CGI對象和WAV網址是http://localhost/downloads/My File.mp3

隨着逃逸,輸出爲:

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

這看起來還好我,但鉻作爲一個相對鏈接,所以當我點擊它或複製鏈接地址,它附加localhost/cgi-bin,給出一個格式不正確的地址,如下所示:

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

我沒有在原始URL領先'http://'試圖以此爲好,並可以產生相同的不良行爲。我也嘗試使用不帶主機名的絕對URL,例如/downloads/My File.mp3,但這也具有相同的行爲。我已經在chrome和firefox上測試過了,兩者都有相同的結果。

我也試過URI ::逃跑,但它也做了同樣的事情。

我在做什麼錯?

回答

3

你應該逃避的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

我只想逃避的文件名。

+0

我嘗試過了,這工作。但我仍在尋找爲什麼轉義URL的開始不起作用。正如我所說的,不逃避任何事情也適用於我(儘管它會破壞舊版瀏覽器) –

0

因爲escape轉換是有特殊含義的URL,因此它可以被用作數據的任何字符。如果你在一個完整的URL養活那麼你得到像//東西(用於分隔主機方案)轉化爲%2F%2F(雙斜槓)。

相關問題