.htaccessのRewriteRuleはなぜ理解しにくいのか

RewriteRuleによるリダイレクトの解説 .htaccess

こんにちは。俺メモです。

最近、WordPressとPHPを再開しました。PHPを使ってサイトの運用を始めようとしたとき、まず最初に書いたのは「.htaccess」でした。リダイレクトを設定してSEO対策するぞと意気込んでいましたが、いきなりRewriteRuleで躓きました。

私と同じ境遇の人がいるはずなので、RewriteRuleを分かりやすく解説します。

RewriteRuleを確認するためのキャッシュの削除と無効化

まずRewriteRuleの機能が確認できるように、ブラウザのキャッシュを消去してキャッシュの機能を無効にして下さい。
ブラウザのキャッシュのせいで、RewriteRuleがうまく機能していても、リダイレクトされていないかのように見えてしまうからです。

RewriteRuleを勘違いしてしまう原因

RewriteRuleの説明で以下のような定義がよく見られます。

RewriteRule 条件 置換文字列 [フラグ] 

これを見て 、条件で指定した文字列が置換文字列で置き換えられると、多くの人は勘違いしてしまいます(私も含めて)。 しかし、実際のRewriteRuleの機能は全く違います。まずは「置換」という固定観念は捨てて、Rewriteを直訳した「書き換え」という考え方に改めてください。

RewriteRuleの本当の意味

前述のRewriteRuleの定義では固定観念が捨てられないので、本記事ではRewriteRuleを以下のように定義します。

 RewriteRule パターン 書換文字列 [フラグ] 

パターン:正規表現のパターンで表される文字列。検査対象文字列に対して、正規表現でマッチした文字列が存在すればURLを書き換え、書換文字列で書き換えたURLにリダイレクトします。

書換文字列:URLを書き換える文字列。URLの一部あるいは全てをこの文字列で書き換え、書き換え後のURLでリダイレクトします。

正規表現の詳細については本記事では割愛します。

パターンについて

前述の説明の中で、検査対象文字列と書きましたが、それはURLのどの文字列を指しているか。

答えは、URLのうちドメイン以降の文字列(ドメイン直後のスラッシュは除く) である。つまり、検査対象文字列はURIとなります。

例えば、パターンを「nde」と表現し、URLがhttp://sample.com/index.htmlの場合、検査対象文字列は「index.html」となるため、マッチしたと判断されます。

注意:複数のスラッシュは単一のスラッシュに自動で変換されます。
例えば、 入力されたURLがhttp://sample.com//////index.html////// の場合、検査対象文字列は、 「index.html」となります。 これはURIの仕様と同じです。

書換文字列について

正規表現によってマッチした文字列が存在する場合URLの書き換えが行われます。書き換えの方法は、書換文字列の表現によって以下3つのパターンがあります。

① 書換文字列の先頭にスラッシュ「/」を入れない場合

「http(s)://(ドメイン名)/」+「 .htaccessのあるディレクトリまでの絶対パス」+「/」+「書換文字列」のURLにリダイレクトします。

例えば、正規表現のパターンがマッチした前提で、書換文字列を「index2.html」とし、入力されたURLが「http://localhost/random1/random2/index1.html」の場合(xamppでドキュメントルートをhtdocsに設定し、.htaccessファイルをhtdocsディレクトリに置いた場合)、「http://localhost/C:/xampp/htdocs/index2.html」にリダイレクトします。

② 書換文字列の先頭にスラッシュを入れた場合

「http(s)://(ドメイン名)」+「書換文字列」のURLにリダイレクトします。

例えば、正規表現のパターンがマッチした前提で、書換文字列を「/index2.html」とし、入力されたURLが「http://localhost/random1/random2/index1.html」の場合(xamppでドキュメントルートをhtdocsに設定し、.htaccessファイルをhtdocsディレクトリに置いた場合)、「http://localhost/index2.html」にリダイレクトします。

③ 書換文字列をURLで表現した場合

書換文字列のURLにリダイレクトします。書換文字列が不完全なURLですと、①のパターンでリダイレクトします。

例えば、正規表現のパターンがマッチした前提で、書換文字列を「http://localhost/random3/index2.html」とし、入力されたURLが「http://localhost/random1/random2/index1.html」の場合(xamppでドキュメントルートをhtdocsに設定し、.htaccessファイルをhtdocsディレクトリに置いた場合)、「http://localhost/random3/index2.html」にリダイレクトします。

実際の運用では②③を使ってください。①を使う場面はほぼないでしょう。言い換えれば、書換文字列は、「先頭にスラッシュを付ける」あるいは「URLを指定する」のどちらかの選択しかありません。しかし、RewriteRuleの使用例として、書換文字列を①で説明するサイトが多く存在します。そのようなサイトは混乱の元となるので無視したほうがよいでしょう。

R=301のフラグでユーザーに表示されるURLを書き換える

RewriteRuleにR=301のフラグを付けない場合、ユーザーの検索窓には書き換え後のURLが表示さず、リダイレクトします。 ユーザーの検索窓に書き換え後のURLを表示させたい場合には、「R=301」のフラグを付けるとよいでしょう。

R=301のフラグがある場合

R=301のフラグあり

R=301のフラグがない場合

R=301のフラグなし

RewriteCondについて

実はRewriteRuleが理解できてしまえば、RewriteCondは簡単です。RewriteCondの定義は以下の通りです。

RewriteCond パターン 検査対象文字列 [フラグ]

正規表現のパターンに、検査対象文字列にマッチする文字列が存在すれば、RewriteRuleを実行します。

RewriteRuleに追加の条件を加えたいときに使いますが、まずはRewriteRuleをしっかりと理解して下さい。そうでないと混乱の元ととなります(私がそうでした)。

最後に

.htaccessのたった一つのディレクディブを理解するのにかなりの時間を要してしまいました。本記事を見て少しでも理解が早まれば幸いです。

コメント

タイトルとURLをコピーしました
//コードのコピーボタン //参考URL:https://lovagelab.com/posts/3406/