mod_rewrite x クエリ文字列(/?q=)の変数化
mod_rewriteを利用して、RewriteCond ,RewriteRuleを併用すると、
要求されたURLのクエリ文字列から置換後URLに対して、
変数として挿入することができるようになります。
ここでは、実際に指定した.htaccessと置換動作についてご紹介します。
mod_rewrite x クエリ文字列(/?q=)の変数化
mod_rewriteを利用したクエリ文字列の値を、
変数として利用すると、置換後文字列に対して要求のあったクエリ文字列を、
置換後文字列内に含んだURLを組み立てることができます。
クエリ文字列の置換後文字列への挿入
クエリ文字列を実際に置換後文字列に対して含ませる様子は、
以下のような.htaccessを記述することで確認ができます。
1 2 3 4 5 6 |
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{QUERY_STRING} ^(.*)$ RewriteRule .* http://redirect.trce.info/%1 [R=301,L] </IfModule> |
この場合、以下のような置換が行われています。
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule .* http://redirect.trce.info/%1 [R=301,L]
RewriteCondに指定している「%{QUERY_STRING}」には、
要求したURLに含まれるクエリ文字列が「s=keyword」として格納されています。
これは「?」以降の文字列になっています。
「^(.*)$」によって、「%{QUERY_STRING}」に含まれる文字の、
開始(^)から終了($)までの文字列を「.*」としてマッチングさせています。
()で括ることによって、「.*」にマッチした文字列を変数として格納しています。
RewriteRuleに記載している「%1 」は、
上記のRewriteCondで()で括った部分の文字列が与えられます。
RewriteRule では特に何も指示をしない場合には、
要求したURLに付与されていたクエリ文字列が、
置換後URLの末尾に自動的に付加されますので、
「?s=keyword」が重複したように付与されてしまいます。
アクセスによる動作確認
上記の記述による動作は以下のURLで確認することができます。
http://q-modrewrite.trce.info/query/string_value/?s=keyword
転送が行われると以下のURLに置換されるのが分かります。
※単純なサンプル例の為、404エラーページになります。
転送 ⇒ http://redirect.trce.info/s=keyword?s=keyword
クエリ文字列の自動付加しない
上記の例では、置換後URLの末尾にクエリ文字列が付加されていました。
この自動的に付加されないようにするには、
.htaccessに対して以下のように記述する必要があります。
1 2 3 4 5 6 |
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{QUERY_STRING} ^(.*)$ RewriteRule .* http://redirect.trce.info/%1? [R=301,L] </IfModule> |
この場合は置換のルールは同じですが、
置換後文字列の指定の末尾に「?」を指定しています。
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule .* http://redirect.trce.info/%1? [R=301,L]
この「?」を付与する(置換後文字列に含ませる)ことによって、
自動的なクエリストリングの付加を停止することができます。
詳細は以下でご紹介しています。
アクセスによる動作確認
上記の記述による動作は以下のURLで確認することができます。
http://q-modrewrite.trce.info/query/string_valuenoadd/?s=keyword
転送が行われると以下のURLに置換されるのが分かります。
※単純なサンプル例の為、404エラーページになります。
転送 ⇒ http://redirect.trce.info/s=keyword
クエリストリングから文字列を取得して置換後文字列に含ませる
上記の例ではまた置換後文字列に対して、
そのまま「s=keyword」というクエリ文字列がそのまま付加されています。
このままでは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> |
この場合RewriteCond はこれまでと同じですが、
QUERY_STRINGからキーワード部分を変数化しておき、
RewriteRule側では「%1」としてキーワードを置換後URLに対して埋め込んでいます。
また直後に「/」を記述しキーワード名のディレクトリへの要求として転送しています。
最後に「?」を付加しておくことで、
QUERY_STRING文字列を置換後URLに付加しないようにしています。
RewriteCond %{QUERY_STRING} ^s=(.*)$
RewriteRule .* http://redirect.trce.info/%1/? [R=302,L]
アクセスによる動作確認
上記の記述による動作は以下のURLで確認することができます。
http://q-modrewrite.trce.info/query/string_todir/?s=keyword
転送が行われると以下のURLに置換されるのが分かります。
転送 ⇒ http://redirect.trce.info/keyword/
キーワードの変更例
上記の例では与えられたキーワードによって、
キーワード名のディレクトリへのURLへとURL転送を行っています。
その為、キーワードを変更すれば転送先も変更されます。
http://q-modrewrite.trce.info/query/string_todir/?s=someword
この場合、以下に転送されます。
転送 ⇒ http://redirect.trce.info/someword/
クエリストリングから文字列の一部にマッチさせてURL転送する
上記の例ではクエリ文字列に与えられたキーワードのすべてが、
URL転送されることになります。
その為、転送先にディレクトリが存在しないような場合でも転送されることになります。
http://q-modrewrite.trce.info/query/string_todir/?s=nothing
転送先に「nothing」という ディレクトリはまだ用意していませんので、
404エラーが転送先では表示されます。
転送 ⇒ http://redirect.trce.info/nothing/
では、keyword,somewordというキーワードのような
「~word」というキーワードのみの場合にURL転送を行う例に変更してみます。
この場合は.htaccessに対して以下のように記述を変更します。
1 2 3 4 5 6 |
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{QUERY_STRING} ^s=(.*word)$ RewriteRule .* http://redirect.trce.info/%1/? [R=302,L] </IfModule> |
この場合は、RewriteCond部分の条件で「^s=(.*word)$」と指定しています。
この条件では「s=keyword」「s=someword」「s=searchword」などはマッチしますが、
「s=nothing」「s=wordlist」などはマッチしない為、RewriteRuleが実行されず転送されません。
RewriteCond %{QUERY_STRING} ^s=(.*word)$
RewriteRule .* http://redirect.trce.info/%1/? [R=302,L]
アクセスによる動作確認
上記の記述による動作は以下のURLで確認することができます。
転送元URLに対して「~word」という文字を含む場合のみ転送されますので、
以下の例ではそれぞれURL転送が実行されます。
http://q-modrewrite.trce.info/query/string_word/?s=keyword
転送 ⇒ http://redirect.trce.info/keyword/
http://q-modrewrite.trce.info/query/string_word/?s=someword
転送 ⇒ http://redirect.trce.info/someword/
転送元URLに対して「~word」という文字を含まない場合には、
URL転送は行われず、要求したURLがそのまま表示されます。
http://q-modrewrite.trce.info/query/string_word/?s=nothing
転送不可 ⇒ http://q-modrewrite.trce.info/query/string_word/?s=nothing
極端な例をあげると、
以下のようなキーワードを指定した場合にも転送は行われます。
転送 ⇒ http://redirect.trce.info/there_is_a_mysterious_force_called_kotodama_the_word/
さいごに
このようにして、要求されたURLに含まれているクエリ文字列を、
条件として転送の要否判定をおこなわせたり、
転送先のURLにキーワードを含ませたりすることができます。
こうした機能をうまく利用することで、
外部のサイトやブログから転送された独自形式のURLも、
WordPressなどのURL形式に変換して転送することができます。
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に承認されライセンスされています。
公開日:
最終更新日:2014/12/16