HTTP Header小知識
在日常web開發中,經常會自定義一些HTTP Header用以傳遞參數,好像使用起來很簡單,沒什麼需要注意的,其實不然,邊界問題還是需要了解一下的,以免掉進一些小陷阱。
一、Header-Key大小寫敏感問題
RFC2616 4.2定義的標準是不區分大小寫的,但是具體的web伺服器實現並不完全遵循標準,兼容性比較好的做法是可以認為所有web實現都是大小寫敏感的,設值取值時使用相同的KEY,同時避免定義通過大小寫來區分不同的Header-Key;RFC2616標準預定義的Request Header和Response Header都是首字母大寫,自定義的Header通常使用大寫字母,並以X-開頭。
二、Header-Value前後的空白字元會被忽略
SP:空格
HT:水平製表符
CRLF:回車換行
LWS:線性空白,語法=[CRLF] 1*(SP | HT)
RFC2616定義Header-Value語法 = *( field-content | LWS ),如果field-content前後包含LWS的話是會被忽略掉的;推薦的做法是在Header-Value之前添加一個空格,設置Header的時候對field-content進行trim操作,去掉前後的LWS字元。
一個案例:Header中有3個參數UID、KEY、SIGN,其中SIGN=sign(UID+KEY),服務端接受請求後會對SIGN進行校驗,如果UID開頭或者結尾包含LWS字元,那麼就會導致後端取到的UID與前端傳遞的UID不一致,從而導致SIGN校驗失敗。
三、編碼問題
CHAR =
token (標記) = 1*
separators(分割符) = "(" | ")" | "" | "@"| "," | ";" | ":" | "" | | "/" | "[" | "]" | "?" |"="| "{" | "}" | SP | HT
field-name = token
Header-Key可以是除去一些控制字元和特殊字元與分割字元以外的任意ascii碼組成的字元串。Header-Value:比較複雜,不同的協議版本以及不同伺服器的實現都不一樣;簡單一點可以認為與Header-Key一樣,直接傳遞中文是會出現亂碼的;但是有時候必須要傳中文或者其他非ASCII值時怎麼辦呢?做法就是在設置Header-Value之前對其進行URLEncode,服務端接受後進行對應的URLDecode即可。
總結一下,盡量不要在Header中傳遞複雜的參數,避免不必要的麻煩。
TAG:攻城獅進階 |