.htaccessによるIPアドレスでのアクセス制御

Apache2.4以前まではDenyAllowといったディレクティブを使用していましたが、Apache2.4以降それらは非推奨となり、代わりにRequireディレクティブを使用するよう変更されました。

全てのアクセスを拒否

Require all denied

特定のIPアドレスからのアクセスのみ許可

Require ip 192.168.0.1

複数指定

Require ip 192.168.0.1 192.168.0.2

前方一致での指定

Require ip 192.168

ネットワーク指定

Require ip 192.168.0.0/255.255.0.0

CIDRでのネットワーク指定

Require ip 192.168.0.0/16

参考URL

mod_authz_host のドキュメント
https://httpd.apache.org/docs/2.4/mod/mod_authz_host.html

.htaccessによるHTTPSへのリダイレクト

.htaccess を使用して、http://***.com へのアクセスを https://***.com へリダイレクトします。

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

リダイレクトにはmod_rewriteモジュールを使用します。

簡単な解説

mod_rewriteモジュールはルールベースの書き換えエンジンであり、まずリクエストされたURLを見て、ルールに従ってURLを書き換え、そして必要であれば書き換え後のURLへリダイレクトを促すという仕組みになっています。

RewriteEngine

そのためまず1行目で書き換えエンジンを有効化しています。デフォルトはOffなので、必ず必要になります。

RewriteEngine On

RewriteCond

2,3行目で書き換えのルールを記述しています。RewriteCondはどのURLを書き換えるかという条件を示す部分です。今回のケースでは「httpアクセスの場合」という条件であるため、以下のように記述しています。

RewriteCond %{HTTPS} off

.htaccess では多くの変数を使えます。上の%{HTTPS}もその一つです。%{HTTPS}にはリクエストがhttpsの場合はon、それ以外の場合はoffが格納されています。

RewriteCond の構文は以下のようになっており、

RewriteCond TestString CondPattern

TestStringCondPatternと一致するURLのみが、次のRewriteRuleにて書き換えられます。CondPatternは、今回は単純な文字列ですが、正規表現を使用することもできます。

RewriteRule

RewriteRuleは、どのように書き換えるかを示す部分です。今回は「URLのスキームをhttpsに書き換える」というルールなので、以下のように記述します。

RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

構文は以下のようになっており、

RewriteRule Pattern Substitution [flags]

基本的に正規表現を使って書き換えを行います。

今回はシンプルに、URL全体をhttps://%{HTTP_HOST}%{REQUEST_URI}に変換するようなルールになっています。%{HTTP_HOST}にはHTTPリクエストのHOSTヘッダの値、%{REQUEST_URI}にはリクエストのパスが入っています。

フラグには[R=301,L]を指定しています。まずR=301では、クライアントに対しリダイレクトを促し、その際のHTTPステータスコードを301にすることを記述しています。リダイレクトに使用されるステータスコードはいくつかありますが、恒久的な移動を示す301で良いと思われます。

もう一つのフラグLでは、このルール以降の書き換えルールは適用しないということを示します。今回のケースではこれ以降にルールはないため省略可能ですが、今後の追加などで他の設定とかち合う可能性もあるので書いておいてデメリットはないでしょう。

補足

この書き換えルールではURLの?以降にあるクエリ文字列も消えてしまうように見えますが、mod_rewriteでは特に指定がない限りクエリ文字列はそのまま残すようになっています。そのため、http://***.com?name=taro は https://***.com?name=taro のように、クエリ文字列の情報を残したまま、httpsに変換されます。

参考URL

mod_rewrite のドキュメント
https://httpd.apache.org/docs/current/mod/mod_rewrite.html

.htaccess で使用できる変数一覧
https://httpd.apache.org/docs/current/expr.html