ブラウザでWebページを表示する際に、A要素のNAME属性を使えばページ内の特定の場所にジャンプさせることができる。この機能は掲示板などのように縦に長いページから、目的の場所へ素早く移動するのに便利だ。
たとえば、26番目の発言の近くに
http://www.orquesta.org/takegata/Article/ArticleView.jsp?article_id=29#A29
RFC 2396 によれば、この#より後の文字列はユーザエージェント(つまりブラウザ)側の処理に使うためのもので、URIには含まれないことになっている。つまり、ブラウザは#以降の文字列をWebサーバへ送信してはいけないのだ。
ネットワークモニタなどで確認すると、確かに#以降の文字列はブラウザから送られていないことが分かる。次のようなJSPコードでリダイレクトの指令をブラウザに送信した場合は、その応答としてブラウザから#以降を取り除いたURIがサーバに送られてくるはずだ。
たとえば、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のベータ版ではこの現象は起こらない。if(strArticleId.indexOf("#")!=-1){
strArticle =
strArticleId.substring(0,strArticleId.indexOf("#"));
}
投稿:竹形 誠司[takegata]/2006年 10月 07日 18時 01分
/更新:2009年 02月 26日 15時 21分