淺談HTTP URL 規範 | javascript urldecode
惱人的URLEncode/Decode我們常在開發Web時,會發生連結失效(404Pagenotfound.)、特別的參數值傳遞不正確、QueryString解譯錯誤等等問題或Bug。追究之後常常都是忽略了URL編碼或者用了不正確的編碼所造成,看來我們需要多多認識URL的特性,順便養成「對URL敏感」的習慣。URI規範的歷史淵源先來看看URI的歷史。最早在1994年12月,RFC1738起頭定義了URI最初的規範。經過了幾年的混亂與磨練,一直到了 1998年8月才有了比較廣泛的標準,那就是RFC2396。而我們最常接觸的RFC2616(也就是 HTTP1.1)在處理URI也是遵循RFC2396標準,我們可以在規...
惱人的 URL Encode/Decode
我們常在開發 Web 時,會發生連結失效 (404 Page not found.)、特別的參數值傳遞不正確、Query String 解譯錯誤等等問題或 Bug。追究之後常常都是忽略了 URL 編碼或者用了不正確的編碼所造成,看來我們需要多多認識 URL 的特性,順便養成「對 URL 敏感」的習慣。
URI 規範的歷史淵源
先來看看 URI 的歷史。最早在 1994 年 12 月,RFC 1738 起頭定義了 URI 最初的規範。經過了幾年的混亂與磨練,一直到了 1998 年 8 月才有了比較廣泛的標準,那就是 RFC 2396。而我們最常接觸的 RFC 2616 (也就是 HTTP 1.1) 在處理 URI 也是遵循 RFC 2396 標準,我們可以在規範看見以下描述:
3.2.3 URI ComparisonCharacters other than those in the "reserved" and "unsafe" sets (see RFC 2396 [42]) are equivalent to their ""%" HEX HEX" encoding.
但是後來隨著環境的演進,直到 2005 年 1 月所發佈的 RFC 3986 最終成為目前主流所實作的規範。因此以目前來說,採用 RFC 3986 是比較明智的選擇。
PHP urlencode() 與 rawurlencode() 的差異
先來測試一下:
<?php
$str=1+2&b and c;
echo urlencode($str);
// show: 1%2B2%26b+and+c
echo rawurlencode($str);
// show: 1%2B2%26b%20and%20c
發現了嗎?兩者在於對空白 (space) 的處理有不同的邏輯,根據官方文件描述 PHP 中的 urlencode() function 是遵循 application...