適用 (対象)
サーバーサイドスクリプト言語、及びリダイレクトための URL 又は URL パターンのあるサーバー環境設定ファイルを含む、サーバーサイドのウェブコンテンツ技術
これは達成基準 3.2.5: 要求による変化 (十分な達成方法) に関する達成方法である。
解説
この達成方法の目的は、あるページ (利用者によって要求されたページ) が別のページにリダイレクトされたために、二つの新しいページが間断なく読みこまれることによって引き起こされる混乱を回避することである。いくつかのユーザエージェントは、利用者を指定された秒数の後に別のページにリダイレクトする HTML の meta 要素の使用をサポートしている。これは、一部の利用者、特にスクリーンリーダーを使用している利用者にとって、ページをアクセシブルではないものにしている。サーバーサイドのウェブコンテンツ技術は、利用者を混乱させないリダイレクトを実装する方法を提供している。サーバーサイドスクリプト又はサーバー環境設定ファイルで、3xx 番台のステータスコード、及び転送先の URL の Location ヘッダーを持つ適切な HTTP レスポンスをサーバーが送るようにできる。ブラウザがこのレスポンスを受けると、ロケーションバーが変わり、ブラウザは新しい URL のリクエストをする。
事例
例 1: JSP/サーブレット
Java サーブレット又は JavaServer Pages (JSP) では、開発者は HttpServletResponse.sendRedirect(String url) を使用できる。
… public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { … response.sendRedirect("/newUserLogin.do"); }
このコードは、302 ステータスコード (「Found」) 及び新しい URL の Location ヘッダーを含むレスポンスをユーザエージェントに送る。また、response.sendError(int code, String message) で、ステータスコードとしてインタフェース javax.servlet.http.HttpServletResponse で定義されている定数の一つを用いて、別のステータスコードに設定することも可能である。
… public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { … response.sendError(response.SC_MOVED_PERMANENTLY, "/newUserLogin.do"); }
アプリケーションがセッションに依存するために、アプリケーションが URL のリライトに HttpServletResponse.encodeURL(String url) を使用するなら、メソッド HttpServletResponse.encodeRedirectURL(String url) が HttpServletResponse.sendRedirect(String url) の代わりに使用されるべきである。また、HttpServletResponse.encodeURL(String url) で URL をリライトして、それから HttpServletResponse.sendRedirect(String url) にこの URL を渡すことも可能である。
例 2: ASP
VBScript で書かれた Active Server Page (ASP) では、開発者は Response.Redirect を使用できる。
Response.Redirect "newUserLogin.asp"
又は
Response.Redirect("newUserLogin.asp")
以下のコードは、特定の HTTP ステータスコードを含む、より完全な例である。
Response.Clear Response.Status = 301 Response.AddHeader "Location", "newUserLogin.asp" Response.Flush Response.End
例 3: PHP
PHP では、開発者は header メソッドで生の HTTP ヘッダーを送ることができる。以下のコードは、301 ステータスコードと新しい場所を送る。ステータスが明示的に設定されないなら、リダイレクトのレスポンスは HTTP ステータスコード 302 を送る。
<?php header("HTTP/1.1 301 Moved Permanently); header("Location: http://www.example.com/newUserLogin.php"); ?>
例 4: Apache
以下の例のようにして、開発者は Apache ウェブサーバーがリダイレクトを処理するように構成できる。
redirect 301 /oldUserLogin.jsp http://www.example.com/newUserLogin.do
参考リソース
参考リソースは、あくまでも情報提供のみが目的であり、推薦などを意味するものではない。
- Use standard redirects: do not break the back button! (W3C QA Tip).
- HTTP/1.1 Status Code Definitions: Redirection 3xx.
- HTTP 301 Permanent Redirection Techniques by Shailesh N. Humbad.
- Interface javax.servlet.http.HttpServletResponse in the Java Servlets 2.3 API documentation.
- header in the PHP Manual.
- Apache Module mod_alias in the Apache HTTP Server Version 2.2 Documentation describes how redirects can be specified in Apache 2.2.
- Module mod_alias in the Apache HTTP Server Version 1.3 Documentation describes how redirects can be specified in Apache 1.3.
検証
手順
- 別のウェブページ又はウェブページへのリンク又はプログラムによる参照を見つける。
- 評価されているウェブページ一式における URI への各リンク又はプログラムによる参照において、参照されたウェブページがクライアントサイドリダイレクトを引き起こすコード (例えば、meta 要素又はスクリプト) を含むかどうかを確認する。
- 評価されているウェブページ一式における URI への各リンク又はプログラムによる参照において、参照された URI がリダイレクトを引き起こさない、又は、タイムアウトなしのサーバーサイドリダイレクトをするかどうかを確認する。
期待される結果
- #2 の結果が偽であり、かつ #3 の結果が真である。