IE8のバグ!baseタグとscriptタグの組み合わせで無効なリクエストが発生する
サーバのアクセスログを見ていて、最近やたら変なURLに対するGETリクエストがあるなーと思って調べてみたところ、IE8のバグが原因でした。
Unfortunately, since shipping IE8, we've discovered two problems in the lookahead downloader code that cause Internet Explorer to make speculative requests for incorrect URLs.
Bugs in IE8’s Lookahead Downloader – IEInternals
残念なことにIE8正式版以降には、インターネットエクスプローラの先読みダウンローダーが原因で、無効なURLに対してリクエストを行う危険性があるというバグが2件あることがわかりました。
このうちのひとつが、<script src=〜>で指定した外部JavaScriptファイルのURLを間違えて解釈するというもの。
具体的には、以下のような書き方をしているときに発生するそうです。
(http://www.hoge.jp/ のページだとして)
<html>
<head>
<base href="http://www.hoge.jp/script/" />
<script src="AAA.js"></script>
<script src="BBB.js"></script>
<script src="CCC.js"></script>
</head>
(以下略)
この場合、
http://www.hoge.jp/script/AAA.js http://www.hoge.jp/script/BBB.js http://www.hoge.jp/script/CCC.js
といったURLへアクセスに行くはずですが、
IE8の先読みダウンローダは
http://www.hoge.jp/script/AAA.js http://www.hoge.jp/BBB.js http://www.hoge.jp/CCC.js
にアクセスに行ってしまいます。
なぜか最初のscriptタグしかbaseタグとの相対URLにならない・・・。
ただ、あくまで先読みの失敗なので、HTMLのパース後にキャッシュにないと気づいて改めて正しいURLにアクセスへ行きます。
そのため、ページが崩れるとかの不具合は起きません。
問題なのは先読みが効かないことによる表示の遅延と、余計なリクエストによるサーバ負荷が発生するということです。
対処としては、2回目のscriptタグの前にもbaseタグをつければいいそうです。
<html> <head> <base href="http://www.hoge.jp/script/"> <script src="AAA.js"> <base href="http://www.hoge.jp/script/"> <script src="BBB.js"> <base href="http://www.hoge.jp/script/"> <script src="CCC.js"> </head> (以下略)
なんだか微妙・・・。
ちなみに、試した限りでは画像ファイルとかはちゃんとbaseタグからの相対指定でアクセスするみたいです。
・・・これ、直すのかなぁ。