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.
残念なことにIE8正式版以降には、インターネットエクスプローラの先読みダウンローダーが原因で、無効なURLに対してリクエストを行う危険性があるというバグが2件あることがわかりました。

Bugs in IE8’s Lookahead Downloader – IEInternals


このうちのひとつが、<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タグからの相対指定でアクセスするみたいです。


・・・これ、直すのかなぁ。