昨天設定好 Digest Realm Authentication 之後,測試過 IE7 / Firefox 2,看起來都沒什麼問題。結果今天到公司用 IE6 看的時候,竟然發現怎麼會有 400 Bad Request 錯誤..
查了一下子,才發現原來這是 IE 的 bug,原定身份檢核完畢後,任何連線 IE 都應該會自動帶上 Authorization 的 Header.
Authorization: Digest username=”cychien”, realm=”AWSTATS”, qop=”auth”, algorithm=”MD5″, uri=”/awstats/awstats.pl/”, nonce=”UBoBaJM3BAA=192135920c05c0d0ce0b89e69fbef6144b46ccad”, nc=00000002, cnonce=”a592556fde6ae1e828f360be6081d636″, response=”53580f5e52dd07e62ffa594865aeb1e2″
但碰到有 query string 的 URL 時,IE 就突槌了,摘錄 HTTP Header 資料如下就一切明瞭了
GET /awstats/awstats.pl/awstats.pl?framename=mainleft HTTP/1.1
….
….省略
Cookie: __utma=200320509.1007104159.1151628725.1187006067.1187006101.242; __utmz=200320509.1182908533.228.4.utmccn=(organic)|utmcsr=google|utmctr=%e9%9a%a8%e6%83%b3%e6%84%8f%e8%aa%8c|utmcmd=organic; phpbb2mysql_data=a%3A2%3A%7Bs%3A11%3A%22autologinid%22%3Bs%3A0%3A%22%22%3Bs%3A6%3A%22userid%22%3Bi%3A-1%3B%7D; control-commentControl=false; control-pluginControl=false; control-miscControl=false; control-mediaCastControl=false; rfolder-root=true; rfolder-??????=true; rfolder-??L???=true; __utmb=200320509; __utmc=200320509; JSESSIONID=GQGGcQPrYCQhzvCpyVKxJBGwmfNpy1cs2wXfy1bv1sgST9vSYyL1!-857858892
Authorization: Digest username=”cychien”, realm=”AWSTATS”, qop=”auth”, algorithm=”MD5″, uri=”/awstats/awstats.pl/awstats.pl
?framename=mainleft“, nonce=”UBoBaJM3BAA=192135920c05c0d0ce0b89e69fbef6144b46ccad”, nc=00000003, cnonce=”8b98b9b1072e4c812443386f8363c07c”, response=”6d5c775889d9e631aed40cfafd19ce9a”
問題就出在 Authorization 的 uri 參數中,IE 的 bug 註定不會將 query string 附上,所以Apache 會認為與先前的 uri 不同,所以回覆 Bad Request.
針對微軟的老大心態,死就是不改他的 bug,所幸 Apache 從 2.0.51 之後也推出一組解決方案,藉以解決 IE query string 問題.
只要在 httpd.conf 中加上
BrowserMatch “MSIE” AuthDigestEnableQueryStringHack=On
只有針對 IE 瀏覽器,才會忽略 Authorization uri 參數的錯誤。經過測試果然有效。特別記錄一下..