mod_rewrite x クエリ文字列(/?q=)URL転送
クエリストリングを含むURL形式から、
クエリ文字を条件に指定するようなURL転送にはmod_rewriteを利用します。
mod_alias (Redirect、RedirectPermanent、Redirect Match)を利用した場合には、
実現ができないような転送条件などもmod_rewriteによる転送であれば、
自在に表現することができます。
ここでは、mod_rewriteを利用して、
クエリ文字列を利用したURL転送についてご紹介します。
mod_rewrite による クエリ文字列を含むURL転送検証
mod_rewriteは利用できるオプションが非常に多くある為、
すべてのパターンをご紹介することはできませんが、
クエリ文字列を利用したURL転送で考えられるパターンを例にご紹介します。
一般的によく見かけるクエリ文字列を含むURL形式は以下のような感じかと思います。
他にもあるとは思いますが。
- /?q=nnn
- /?s=keyword
- /?tag=tagname
mod_rewrite
クエリ文字列を含むURLを転送する際には、mod_rewrite を利用するようにと、
mod_aliasのヘルプページにも書かれています。
mod_alias – Apache HTTP サーバ バージョン 2.2 (引用)
mod_alias は簡単な URL 操作向けに設計されています。 より複雑な操作、クエリーストリングの操作には、mod_rewrite で提供されるツールを使用してください。
mod_rewriteのヘルプは以下で確認できます。
mod_rewrite – Apache HTTP Server Version 2.2
ざっくり書くと、以下のような構文で記述します。
1 2 3 4 5 6 |
<IfModule mod_rewrite.c> RewriteEngine On/OFF RewriteBase / RewriteCond [判定対象] [判定条件] RewriteRule [置換前条件パス] [置換後URLパス] [フラグ] </IfModule> |
判定対象部分には、他のリダイレクト関連のディレクティブのような、
要求パスに対しての置換判定だけでなく、
サーバー変数を利用した様々な条件判定が利用できます。
利用可能なサーバー変数の例
mod_rewrite – Apache HTTP Server Version 2.2 (引用)
HTTP headers: connection & request: HTTP_USER_AGENT
HTTP_REFERER
HTTP_COOKIE
HTTP_FORWARDED
HTTP_HOST
HTTP_PROXY_CONNECTION
HTTP_ACCEPTREMOTE_ADDR
REMOTE_HOST
REMOTE_PORT
REMOTE_USER
REMOTE_IDENT
REQUEST_METHOD
SCRIPT_FILENAME
PATH_INFO
QUERY_STRING
AUTH_TYPEserver internals: date and time: specials: DOCUMENT_ROOT
SERVER_ADMIN
SERVER_NAME
SERVER_ADDR
SERVER_PORT
SERVER_PROTOCOL
SERVER_SOFTWARETIME_YEAR
TIME_MON
TIME_DAY
TIME_HOUR
TIME_MIN
TIME_SEC
TIME_WDAY
TIMEAPI_VERSION
THE_REQUEST
REQUEST_URI
REQUEST_FILENAME
IS_SUBREQ
HTTPS
上記のサーバー変数によって与えられる値は、
以下のようにPHPなどでも確認することができます。
こうした変数を利用して、条件の判定が行えます。
検証について
これまでは「/?s=keyword」形式を例として、
検索キーワードを含むURLを対象に検証を行いました。
ここでは、以下の投稿で検証を行ってきた例とは別にさせて頂きます。
mod_rewriteの仕様として「%{QUERY_STRING}」サーバー変数から
取得できるできる値は「?」マーク以降のURL部分のみになります。
http://q-modrewrite.trce.info/dir1/?s=keyword → %{QUERY_STRING}(値: s=keyword)
mod_rewriteを利用した場合、こうしたクエリキーワードと、
要求ディレクトリパスの条件は切り分けて考える必要があります。
ここではキーワードによってディレクトリを振り分けたり、
要求されたディレクトリを条件に振り分けたりと言う複合的な転送例についてご紹介します。
与えられたパスとクエリ文字列にて様々なURL転送を行ってみます。
クエリストリング部の変数化について
mod_rewrite を利用してクエリストリング部を条件判定に利用したりする場合には、
置換後文字列部分にクエリ文字列を変数として利用することができます。
尚、本投稿の例ではクエリキーワードを転送先のURLには含まず、
そのままトップページなどの固定ページへ転送しています。
クエリキーワードから動的に転送先ページを切り替えたいような場合には、
以下でご紹介しています。
クエリキーワードによる判定
このようにクエリパラメータが含まれる要求を受けた場合に、
個別の処理を行いたい場合には、以下のように.htaccessに対して指定します。
1 2 3 4 5 6 |
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{QUERY_STRING} ^s=keyword$ RewriteRule .* http://redirect.trce.info/ [R=302,L] </IfModule> |
?s=keyword としてパラメータ要求があった場合には、
%{QUERY_STRING} サーバー変数に対して、
「s=keyword」文字列が設定されてきます。
この場合、クエリキーワードが「s=keyword」と一致した場合に、
URL転送が実行されます。
RewriteCond %{QUERY_STRING} ^s=keyword$
RewriteRule .* http://redirect.trce.info/ [R=302,L]
アクセスによる動作確認
実際にアクセスするとリダイレクトが行われることが確認できます。
http://q-modrewrite.trce.info/dir1/?s=keyword
転送 ⇒ http://redirect.trce.info/?s=keyword
このようにしてクエリ文字列を判定し、URL転送を行うことができます。
単純に判定を行って転送をするような場合は、
転送先URLに自動付加されるクエリ文字列が邪魔になるかもしれません。
そんな時には引き継がずに転送を行うといいでしょう。
クエリキーワードによる判定と対象ディレクトリ指定
次に、クエリパラメータが含まれる要求を受けた場合に、
要求されたクエリを元にして、
ディレクトリを振り分けて転送を行う場合を考えます。
この場合のパターンは以前も以下でご紹介しました。
以下のように.htaccessに対して指定します。
1 2 3 4 5 6 |
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{QUERY_STRING} ^s=(.*)$ RewriteRule .* http://redirect.trce.info/%1/? [R=302,L] </IfModule> |
このパターンではクエリキーワードに指定されたキーワードから、
転送先のディレクトリ名へと転送を行っています。
ここでは、デフォルトで転送先URLに対して付与されてしまう、
クエリキーワードを、「?」を付与することで削除しています。
RewriteCond %{QUERY_STRING} ^s=(.*)$
RewriteRule .* http://redirect.trce.info/%1/? [R=302,L]
アクセスによる動作確認
実際にアクセスするとリダイレクトが行われることが確認できます。
http://q-modrewrite.trce.info/category/?s=keyword
転送 ⇒ http://redirect.trce.info/keyword/
検証結果
結果として、どのように記述したとしても、
クエリストリング部分を判定条件に記述することが容易に行え、
細かなマッチングを行うことができるようになります。
クエリストリングによる判定はRewriteCond にて値を判定する必要があります。
ヘルプに明記されているとおり、
クエリストリングを含むURL形式はmod_rewriteを利用して転送するのがいいようです。
Apache,Apache Hadoop,Apache Subversion,Hadoop,HDFS,HBase,Hive,Mahout,Pigは、
Apache Software Foundationの米国およびその他の国における登録商標または商標です。
ApacheソフトウェアはApache Software License (原文)および
Apache License, 2.0 (原文)に基づきOpen Source Initiativeに承認されライセンスされています。
公開日: