若是我想使用變量建立URL,我有兩個選擇來編碼字符串。 urlencode()
和rawurlencode()
。 php
究竟有什麼區別,哪些是首選的? html
我認爲空格必須編碼爲: 安全
%20
+
在URL查詢字符串組件或表單數據中使用時(參見17.13.4表單內容類型 ) 如下示例顯示了rawurlencode
和urlencode
的正確用法: 服務器
echo "http://example.com" . "/category/" . rawurlencode("latest songs") . "/search?q=" . urlencode("lady gaga");
輸出: 網絡
http://example.com/category/latest%20songs/search?q=lady+gaga
若是您反過來編碼路徑和查詢字符串組件會發生什麼? 對於如下示例: ide
http://example.com/category/latest+songs/search?q=lady%20gaga
latest+songs
而不是latest songs
q
將包含lady gaga
惟一的區別在於處理空間的方式: oop
urlencode - 基於遺留實現將空格轉換爲+ 編碼
rawurlencode - 基於RFC 1738將空格轉換爲%20 url
區別的緣由是由於+在URL中保留而且有效(未編碼)。 spa
我真的很想看到選擇其中一個的一些緣由...我但願可以選擇一個並永遠使用它而不用大驚小怪。
很公平,我作出這些決定時會遵循一個簡單的策略,我將與您分享,但願它能夠提供幫助。
我認爲這是HTTP / 1.1規範RFC 2616 ,它要求「 容忍的應用程序 」
在解析請求行時,客戶端應該容忍解析狀態行和服務器容忍度。
當面對這樣的問題時,最好的策略老是儘量地消費併產生符合標準的東西。
因此個人建議是使用rawurlencode
生成符合標準的RFC 1738編碼字符串,並使用urldecode
向後兼容並容納您可能遇到的任何內容。
如今你能夠接受個人話,但咱們要證實它......
php > $url = <<<'EOD' <<< > "Which, % of Alice's tasks saw $s @ earnings?" <<< > EOD; php > echo $url, PHP_EOL; "Which, % of Alice's tasks saw $s @ earnings?" php > echo urlencode($url), PHP_EOL; %22Which%2C+%25+of+Alice%27s+tasks+saw+%24s+%40+earnings%3F%22 php > echo rawurlencode($url), PHP_EOL; %22Which%2C%20%25%20of%20Alice%27s%20tasks%20saw%20%24s%20%40%20earnings%3F%22 php > echo rawurldecode(urlencode($url)), PHP_EOL; "Which,+%+of+Alice's+tasks+saw+$s+@+earnings?" php > // oops that's not right??? php > echo urldecode(rawurlencode($url)), PHP_EOL; "Which, % of Alice's tasks saw $s @ earnings?" php > // now that's more like it
看起來PHP確實考慮到了這一點,即便我歷來沒有遇到任何拒絕這兩種格式的人,我想不出更好的策略來採用你的事實策略,對嗎?
的nJoy!
我相信urlencode用於查詢參數,而rawurlencode用於路徑段。 這主要是因爲路徑段的%20
和查詢參數的+
。 請參閱如下有關空格的答案: 什麼時候將空間編碼爲加號(+)或%20?
可是%20
如今也適用於查詢參數,這就是rawurlencode老是更安全的緣由。 然而,在編輯的用戶體驗和查詢參數的可讀性很重要的狀況下,傾向於使用加號。
請注意,這意味着rawurldecode
不會將+
解碼爲空格( http://au2.php.net/manual/en/function.rawurldecode.php )。 這就是$ _GET老是自動經過urldecode
傳遞的緣由,這意味着+
和%20
都被解碼爲空格。
若是您但願輸入和輸出之間的編碼和解碼保持一致,而且您已選擇始終使用+
而不是%20
做爲查詢參數,則urlencode
適用於查詢參數(鍵和值)。
結論是:
路徑段 - 始終使用rawurlencode / rawurldecode
查詢參數 - 用於解碼老是使用urldecode(自動完成),對於編碼,rawurlencode或urlencode都很好,只需選擇一個是一致的,特別是在比較URL時。
%20
vs. +
在大多數狀況下,我看到使用rawurlencode()
的最大緣由是由於urlencode
將文本空間編碼爲+
(加號),其中rawurlencode
將它們編碼爲常見的%20
:
echo urlencode("red shirt"); // red+shirt echo rawurlencode("red shirt"); // red%20shirt
我已經特別看到某些接受編碼文本查詢的API端點指望看到空格的%20
,所以若是使用加號則會失敗。 顯然,API實現之間會有所不一樣,您的里程可能會有所不一樣。
簡單* rawurlencode路徑 - 路徑是「?」以前的部分 - 空格必須編碼爲%20 * urlencode查詢字符串 - 查詢字符串是「?」以後的部分 - 空格被更好地編碼爲「+」= rawurlencode一般更兼容