
urlはそのまま中身をリダイレクトする。.htaccessのフラグや条件記号をおさらい
設定によってはアドレスバーのURLをそのまま変更することなく、違うページやディレクトリを表示させる事もできます。
[R=301,L]や[L]などのフラグ表示で、外部転送や内部転送などリダイレクトの種類を変更できるようになっています。
設定されているフラグや条件記号をおさらいしましょう。
urlはそのままのリダイレクト転送
mod_rewrite構文のリダイレクトの種類には2つあります。外部転送と内部転送です。
mod_rewriteでリダイレクトをする場合、301リダイレクトという形で別のURLやディレクトリ・サイトなどへ飛ばす事がほとんどです。これが外部転送です。
しかしそれとは別に、アドレスバーのURLはそのまま変えずに、表示されるページ内容だけを別ページのものに変更する事ができます。
それがいわゆる内部転送(フォワード)と呼ばれるものです。
URLの変更がない内部転送のメリット
内部転送にはいろいろなメリットがあると思います。
あえて一つ例を挙げるとすると、例えば情報が定期的に一新されるようなコンテンツのHTMLページがあるとしましょう。
月に1回刷新され、1年経ったら一巡してまた初月のコンテンツに戻るような仕組みだったとします。
urlはそのまま月ごとに違うページを表示できる
この時、月ごとに毎回情報を書き換えするよりも、別途12種類のコンテンツページを用意しておき、今回の内部転送をした方が便利ですよね
内部転送すればすぐに該当月のコンテンツページを表示できます。
urlは変わらずなのでリンク先を変更する必要がないし、毎月ページが変わらないのでSEO的にも価値を継承する必要がありません。
他にもいろいろあると思いますので、活用法は探してみて下さい。
外部転送(External Forwarding:URLが変わる)
外部転送は(External Forwarding)と呼ばれ、リクエストされたURLを書き換えて別のディレクトリや別ページ(外部サイト)に転送します。
一般的によく使われるリダイレクトですね。
外部転送記述例
下記は、lpディレクトリ配下へのアクセスを強制的にassetディレクトリへ転送させる処理です。
表示されるURLはもちろん変わります。
RewriteEngine On
RewriteRule ^lp/(.*) /asset/$1 [R=301,L]
.htaccessで設定ができます。行末の[R=301,L]でこれが外部転送である事を示唆しています。
内部転送(Internal Forwarding:URLはそのまま)
内部転送は(Internal Forwarding)と呼ばれ、アドレスバーのURLはそのまま内部で表示先を変更するものです。
いわゆる一般的なリダイレクト処理ではありません。
この設定はhtaccessには設定できないので、httpd.confにする必要があります。
内部転送記述例
下記は、lpディレクトリ配下へのアクセスをパスを維持しながらassetディレクトリへ転送させる処理です。
RewriteEngine On RewriteRule ^lp/(.*) /asset/$1 [L]
実際にアドレスバーは「lp/」の表示のまま、表示されているページ自体は「asset/」のディレクトリ内が表示されます。
行末の[L]でこれが内部転送である事を示唆しています。
外部転送と内部転送のフラグ表示
・外部転送:異なるドメインやURLパスに転送。[R=301,L]
・内部転送:URLはそのまま、内部で別のディレクトリを表示。[L]
.htaccess では RewriteRule の内部転送 [L]はできない
htaccessファイルにはRewriteRuleによる内部転送[L]を掛ける事はできません。
「.htaccess」でのmod_rewriteでは、書き換えてもまた最初からループしていく仕様の方が優先されます。
[L]の内部転送を有効にするには、httpd.confに記述する必要があります。
フラグ表示:[R=301,L]や[L]は何を示す?
この[R=301,L]や[L]の部分は「フラグ」と呼ばれ、RewriteRuleの設定行に追加できるオプションとなります。
301などの数字はHTTPステータスコード(リダイレクトコード)と呼ばれ、アクセスされたWEBページの状態を発信する情報になります。
フラグ[R]について
[R]は外部転送、つまりリダイレクトをする時に記述するフラグです。
通常のリダイレクトでは301を利用し、なにか特別な理由で一時的にリダイレクト処理を行うのであれば、302を利用します。
・[R=301]:301リダイレクト(永久)
・[R=302]:302リダイレクト(一時的)
[R=301]か[R=302]のどちらかを設定する事で、301リダイレクトか302リダイレクトかを実施します。
[R]のみは302リダイレクトを意味する
フラグを[R]と省略した場合、[R=302]と同じ意味になりますので注意しましょう。
[R]フラグを付ける際は必ず[L]も併記
301か302で[R]フラグを利用するときは、「,」を打って必ず[L]も併記する必要があります。
そうしないとエラーになってしまいますので、これは仕様だと考えて下さい。
ですので、RewriteRuleを記載した構文は行末にセットで[R=301,L]と記述することになります。
※[L,R=301]と並びを変えても大丈夫です。
フラグ[L]について
内部転送をする時は、[L]のみフラグを表記する事になります。
[L]フラグは本来、そこでRewriteRule自体を終了する事を意味しています。
Wordpressの.htaccessではよく見られる記号ですね。
[L]のみのフラグを設置した時はリダイレクトをしないので、外部サイトの絶対パスなどを転送先に選ぶ事ができないようになっています。
[L]フラグのみが設定できない記述例
RewriteEngine On RewriteRule ^(.*) http://example.com/$1 [L]
上記の様には出来ないという事になりますね。
フラグ記号の種類と意味
一つ一つ詳しくは紹介しませんがフラグ記号には他にもたくさんの種類と用途があります。一部をご紹介しましょう。
フラグ | 説明 |
---|---|
C(Chain) | マッチしたら、次のルールを評価 |
END(END) | リライト処理停止。ENDの場合は.htaccess単位で終了する。 |
F(Forbidden) | アクセス禁止。[L]フラグと同様、以降のルールは無視 |
G(Gone) | 削除(410-Gone) |
L(Last) | マッチしたらRewriteを止める。以降のルールは無視 |
NC(No Case) | 大文字小文字を無視 |
NE(No Escape) | ".", "?", "%"などの特殊文字が"%25″のようにエンコードされるのを防ぐ |
OR・AND | RewriteCondを複数指定する場合。指定しないならAND |
P(Proxy) | ルールに一致したリクエストをプロキシを介して処理する。 以降の処理はLフラグと同じようにルール停止 |
PT(Path Through) | Rewriteを終了し、それ以外の処理に移行 |
QSA(Query String Append) | 移転元が保有していたクエリ文字を引数として引き継ぐ |
R(Redirect) | 指定したURLにリダイレクト。 [R=301]のようにリダイレクトコードも付加できる。 [L]フラグと同様、以降のルールは無視される |
Wordpressサイトの.htaccessフラグ表示
下記がよくWordpressの初期状態で設定される.htaccessの記述です。
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule>
上記の記述では条件記号「-f」「-d」などで、ファイルやディレクトリへのアクセスを許可し、それ以外のパスへのアクセスを全て/index.phpに送っています。
RewriteRuleの部分は上記で説明した、内部転送の「L」記号になっていますよね。
Wordpressのhtaccess各行の説明
4行目:RewriteRule ^index\.php$ - [L] は、基本的にはこの4行目でindex.phpと記述して、無限ループの防止をしています。
ここがちょっと複雑なのですが、条件にあてはまれば4行目から7行目をループ処理でぐるぐる回るんですね。
index.php以外へのリクエストがあった場合はそれを表示します。
5・6行目:RewriteCondで%{REQUEST_FILENAME}がファイルでなく(!-fの部分)、ディレクトリでもない(!-dの部分)場合は、4行目のRewriteを実行します。
7行目:RewriteRule . /index.php [L] は、「.」を「/index.php」としてRewriteするという意味です。
内部転送を利用したページ生成システム
Wordpressのシステムは本来、ページアドレスを読み取りそれに対応したページを生成する仕組みです。
4行目で[L]となっているので、リクエストされたアドレスを維持したままindex.phpを読み込み、phpシステムがそのリクエスト内容を制御します。
結果的に対応するページが動的に生成され、WEBページとして表示されるシステムになっているのですね。
RewriteCondの条件記号について
.htaccess内のRewriteCondで記述されている条件記号には下記のような種類があります。
RewriteCondで条件に一致するパターンについては、Perl互換の正規表現で指定する事になります。
パターン | 意味 |
---|---|
! | ~でない |
< | 文字列より上の場合 |
> | 文字列より下の場合 |
= | 文字列と等しい場合 |
<= | 文字列以上の場合 |
>= | 文字列以下の場合 |
-d | ディレクトリが存在する場合 |
-f | ファイルが存在する場合 |
-eq | いわゆる「=」イコール |
-ge | いわゆる「<=」以上 |
-gt | いわゆる「<」より上 |
-le | いわゆる「>=」以下 |
-lt | いわゆる「>」未満 |
-F | アクセス可能な有効なパスを指している場合 (内部サブリクエストを用いてcheckされる) |
-l | シンボルリンク(-H、-Lも同じ意味。小文字エル) |
-s | ファイルが存在し、サイズが0でない |
-U | アクセス可能な有効なURLとなっている場合 |
-x | 実行権限がある場合 |