常時SSL化対応で、httpのアクセスをhttpsのアクセスに書き換えるおまじないを何も考えずにコピペで対応したが、一体どんな意味があったのかちゃんと内容を知りたい!という方向けにmod_rewriteの見方を解説いたします。
mod_rewriteとはApacheの拡張機能の一つでURLを書き換えるための機能です。ApacheはWebサイト作成に必要なミドルウェアのことで、多くのレンタルサーバーではあらかじめセットされています。
目次
mod_rewriteの見方
常時SSL化で設定した内容
常時SSL化対応で、httpのアクセスをhttpsに変換するために以下のおまじないを.htaccessファイルに記述したかと思います。
参考:ロリポップサーバーでHTTPS化する方法について
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>
こちらの内容を1行づつ解説いたします。
1行目:<IfModule mod_rewrite.c>
IfModuleとは指定したモジュールが存在するときに処理されるディレクティブです。IfModule で、mod_rewrite.cが呼ばれているので、mod_rewriteの機能があれば処理するぜって意味になります。
2行目:RewriteEngine On
RewriteEngine をOnと指定しています。これでmod_rewriteが有効になります。
3行目:RewriteCond %{HTTPS} off
RewriteCond はURLを書き換える条件を書きます。CondはCondition(条件)の略語みたいですね。
%{HTTPS}は、HTTPSアクセスかどうかという意味で、その後にoffを記述することで、HTTPSアクセスじゃないとき(=HTTPのアクセスのとき)という条件になります。offをonに変えると、HTTPSアクセスの時にという意味に変わります。
他にもさまざまな条件文が用意されています。それぞれの意味や記述方法は以下のサイトの「変数名」の章が参考になります。
https://weblabo.oscasierra.net/apache-rewritecond-base/
また、RewiteCondはAnd条件やOr条件が取れます。記述例は以下の通り。
例 : 条件を複数指定する場合 (AND条件の例)
RewriteCond %変数名 条件
RewriteCond %変数名 条件
RewriteRule URL書換&転送の記述
例 : 条件を複数指定する場合 (OR条件の例)
RewriteCond %変数名 条件 [OR]
RewriteCond %変数名 条件
RewriteRule URL書換&転送の記述
4行目:RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteRuleはどのようにURLを書き換えるのかルールを書きます。
この場合、^(.*)$ を https://%{HTTP_HOST}%{REQUEST_URI}に書き換えてという具合に読みます。
^(.*)$ってなんやねん!と思った方は正規表現を学んでみましょう。(正規表現でググると色々解説サイトが出てきます。)
正規表現では、^(行頭)(.*)(任意の文字桁数問わず)$(行末)と読みます。
つまり、「http://anotherlife.xyz」であろうが「http://anotherlife.xyz/abcd/efg」であろうが変換元の文字列は何でもOKという意味になります。
次にhttps://%{HTTP_HOST}%{REQUEST_URI}の部分ですが、以下のような意味になります。
%{HTTP_HOST} ・・・閲覧しているサイトのドメインです。幣サイトであればanotherlife.xyzです。
%{REQUEST_URI} ・・・リクエストURI。リクエストのあったページURIと思ってOKです。
この記述により、たとえば、「http://anotherlife.xyz/abcd/efg」で飛んできたアクセスが「https://anotherlife.xyz/abcd/efg」に書き換わります。
最後に[R=301,L]ですが、これはR=301で301リダイレクトせよという意味になり、[L]はLastの意味で条件式の終わりを意味します。Lを付けることでRewrite機能によるURL変換を終了させます。
ちなみに、解説サイト毎に[R=301,L]と記載されていたり、[R,L] 記載されていたりマチマチですが、
[R=301] 永久的なリダイレクト
[R] 一時的なリダイレクト(302リダイレクト)
という意味になります。301と302の詳細な違いは以下のサイトが参考になります。
参考サイト:https://www.suzukikenichi.com/blog/both-301-and-302-pass-pagerank/
参考サイト
①社外からの全ての接続をメンテナンスページにリダイレクトする方法など転送方法のサンプルが多数乗っているサイト。
techscoreサイト