竹形誠司 ブログ
Java+MySQL+Tomcat    »トピック一覧
掲示板へのスパムが多いため、「ご質問」のコーナーはユーザー登録制とさせていただきました。お手数ですが、上の「新規ユーザーの登録」メニューより登録をお願いします。
帳票Web
アプリケーション

受注開発始めました
詳しくは こちら
竹形 誠司 著/ラトルズ刊
JSP帳票アプリケーション実践開発入門
JSP帳票アプリケーション
実践開発入門

JSP業務アプリケーション短期開発入門
JSP業務アプリケーション
短期開発入門

Java+MySQL+Tomcatで始めるWebアプリケーション構築入門
Java+MySQL+Tomcatで始めるWebアプリケーション構築入門

Java+MySQL+Tomcatで作る掲示板とブログ
Java+MySQL+Tomcatで作る
掲示板とブログ
MSIE 6.0におけるリダイレクトの問題
by 竹形 誠司[takegata]
ブラウザでWebページを表示する際に、A要素のNAME属性を使えばページ内の特定の場所にジャンプさせることができる。この機能は掲示板などのように縦に長いページから、目的の場所へ素早く移動するのに便利だ。

たとえば、26番目の発言の近くに

<A NAME="A29">
のようなタグを埋め込んでおいたとする。ブラウザ側でこのページを表示するアドレスの最後に "#A29" を付けておけば、そのページを開いた後、このタグの位置まで自動的にジャンプするようになっている。こんな感じだ。

http://www.orquesta.org/takegata/Article/ArticleView.jsp?article_id=29#A29

RFC 2396 によれば、この#より後の文字列はユーザエージェント(つまりブラウザ)側の処理に使うためのもので、URIには含まれないことになっている。つまり、ブラウザは#以降の文字列をWebサーバへ送信してはいけないのだ。

ネットワークモニタなどで確認すると、確かに#以降の文字列はブラウザから送られていないことが分かる。次のようなJSPコードでリダイレクトの指令をブラウザに送信した場合は、その応答としてブラウザから#以降を取り除いたURIがサーバに送られてくるはずだ。

response.sendRedirect("ArticleView.jsp?article_id=29#A29");
FireFox1.5 やOpera8では確かにそうなっている。しかし問題はMSIE6.0だ。リダイレクトのときに限って#以降を含んだ文字列がURIとしてサーバに送られて来るのだ。本サイトのシステムも、この影響を受けていてエラーの原因を特定するのに苦労した。クエリー文字列を処理する際に送られてくるはずのない "#A29" が混入していたのだ。この現象を回避するため、パラメータarticle_idを取得するコードを次のようにした。クエリー文字列に"#"が混入している場合は、#とそれ以降の文字を削る処理を追加している。

String strArticleId = request.getParameter("article_id");
if(strArticleId.indexOf("#")!=-1){
  strArticle =
    strArticleId.substring(0,strArticleId.indexOf("#"));
}
おそらく、これはIEのバグと言っていいだろう。特定のソフトウェアのバグのために、余計なコードを書かなければならないというのはイマイチ納得がいかないが、使っているユーザの数を考えると無視するわけにもいかない。ちなみに、IE7のベータ版ではこの現象は起こらない。
投稿:竹形 誠司[takegata]/2006年 10月 07日 18時 01分 /更新:2009年 02月 26日 15時 21分