urlencode vs rawurlencode?

若是我想使用變量建立URL,我有兩個選擇來編碼字符串。 urlencode()rawurlencode()php

究竟有什麼區別,哪些是首選的? html


#1樓

我認爲空格必須編碼爲: 安全

  • 在URL路徑組件中使用時爲%20
  • +在URL查詢字符串組件或表單數據中使用時(參見17.13.4表單內容類型

如下示例顯示了rawurlencodeurlencode的正確用法: 服務器

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

#2樓

1.究竟有什麼不一樣之處

惟一的區別在於處理空間的方式: oop

urlencode - 基於遺留實現將空格轉換爲+ 編碼

rawurlencode - 基於RFC 1738將空格轉換爲%20 url

區別的緣由是由於+在URL中保留而且有效(未編碼)。 spa

2.哪一個更好?

我真的很想看到選擇其中一個的一些緣由...我但願可以選擇一個並永遠使用它而不用大驚小怪。

很公平,我作出這些決定時會遵循一個簡單的策略,我將與您分享,但願它能夠提供幫助。

我認爲這是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!


#3樓

我相信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時。


#4樓

空格編碼爲%20 vs. +

在大多數狀況下,我看到使用rawurlencode()的最大緣由是由於urlencode將文本空間編碼爲+ (加號),其中rawurlencode將它們編碼爲常見的%20

echo urlencode("red shirt");
// red+shirt

echo rawurlencode("red shirt");
// red%20shirt

我已經特別看到某些接受編碼文本查詢的API端點指望看到空格的%20 ,所以若是使用加號則會失敗。 顯然,API實現之間會有所不一樣,您的里程可能會有所不一樣。


#5樓

簡單* rawurlencode路徑 - 路徑是「?」以前的部分 - 空格必須編碼爲%20 * urlencode查詢字符串 - 查詢字符串是「?」以後的部分 - 空格被更好地編碼爲「+」= rawurlencode一般更兼容

相關文章
相關標籤/搜索