アクセス制御したい(.htaccess)

1# このディレクトリ全体を、指定したIPアドレスからだけ見られるようにする
2Require ip 192.168.0.0/16
3Require ip 203.0.113.10

.htaccessは、Apacheのウェブサーバーで「そのディレクトリだけ」に効く設定ファイルです。 ファイルを置いたディレクトリと、その下のすべてに設定が適用されます。

アクセス制限、Basic認証、リダイレクトなどを設定できます。 httpd.confのようなサーバー本体の設定ファイルを触れない環境(研究室サーバーの個人スペースなど)で役立ちます。

.htaccessを有効にしたい(AllowOverride)

# httpd.conf の場所を探す
$ find / -name httpd.conf 2>/dev/null
1# httpd.conf 側の設定
2<Directory "/var/www/html">
3    AllowOverride All
4    Require all granted
5</Directory>

.htaccessが効くのは、サーバー本体のhttpd.confでそのディレクトリにAllowOverrideが許可されている場合だけです。

AllowOverride Allですべての上書きを許可、AllowOverride Noneで無効になります。 .htaccessを置いたのに設定が反映されないときは、まずここを確認します。

IPアドレスで許可・拒否したい(Require ip)

1# 許可する
2Require ip 203.0.113.10
3Require ip 192.168.0.0/16
4
5# 拒否する
6Require not ip 198.51.100.20

Require ipで、アクセスを許可するIPアドレスを指定します。 複数行書くと、そのどれかに一致すれば許可されます。

Require not ipで、特定のIPアドレスだけを拒否できます。

1Require all granted    # 全員に許可
2Require all denied     # 全員を拒否

Require all granted / Require all deniedで、一括で許可・拒否できます。

注釈

RequireはApache 2.4で導入されたディレクティブです。 2.2で使われていたOrder / Allow / Denyは非推奨で、書き方も分かりにくいため、 2.4以降ではRequireを使います。

IPアドレスの範囲を指定したい(CIDR)

1Require ip 192.168.0.0/16    # 192.168.0.0 〜 192.168.255.255
2Require ip 192.168.1.0/24    # 192.168.1.0 〜 192.168.1.255
3Require ip 10.0.0.0/8        # 10.0.0.0   〜 10.255.255.255

IPアドレスの後に/数字を付けると、範囲を指定できます(CIDR表記)。

/数字は「アドレスの先頭から何ビットを固定するか」で、 数字が小さいほど広い範囲、大きいほど狭い範囲になります。

範囲を書くときは、192.168.1.5/24のような途中のアドレスではなく、 192.168.1.0/24のようにその範囲の先頭アドレスで書きます。

特定のファイルだけ制限したい(<Files>)

1# wp-login.php へのアクセスを、指定IPからだけに限定する
2<Files "wp-login.php">
3    Require ip 203.0.113.10
4</Files>

<Files>で囲むと、その中のRequireは指定したファイルだけに効きます。

WordPressのログイン画面や管理ファイルなど、 ディレクトリ全体ではなく特定のファイルを守りたいときに使います。

Basic認証でパスワードをかけたい(AuthType Basic)

1AuthType Basic
2AuthName "Restricted Area"          # 認証ダイアログに表示される文言
3AuthUserFile /var/www/etc/.htpasswd  # パスワードファイルの絶対パス
4Require valid-user

AuthType Basicで、アクセス時にIDとパスワードを要求できます。 Require valid-userは「パスワードファイルに登録された誰か」を意味します。

パスワードファイルはhtpasswdコマンドで作ります。

# 新規作成(-c は初回のみ)
$ htpasswd -c /var/www/etc/.htpasswd alice

# 2人目以降は -c を付けない
$ htpasswd /var/www/etc/.htpasswd bob

パスワードはハッシュ化して保存されます。 パスワードファイルは、ウェブで公開されるディレクトリの外に置きます。

注釈

Basic認証はIDとパスワードをそのまま送るため、HTTP(暗号化なし)では盗聴されます。 HTTPSが有効なサイトであれば、通信が暗号化されるのでBasic認証で問題ありません。

社内は素通し、社外はパスワードにしたい(<RequireAny>)

1AuthType Basic
2AuthName "Restricted Area"
3AuthUserFile /var/www/etc/.htpasswd
4
5<RequireAny>
6    Require ip 192.168.0.0/16
7    Require valid-user
8</RequireAny>

<RequireAny>で囲むと、中の条件のどれか1つを満たせばアクセスできます。

上のサンプルは「社内IPからならそのまま、それ以外はBasic認証」という設定です。 逆に、すべての条件を満たす必要がある場合は<RequireAll>を使います。

リダイレクトしたい(Redirect)

1# 301: 恒久的に移動した
2Redirect 301 /old-page.html /new-page.html
3
4# 302: 一時的な移動
5Redirect 302 /campaign /

Redirectで、あるURLへのアクセスを別のURLに転送します。 301は「完全に移転した」、302は「一時的」で、検索エンジンの扱いが変わります。

HTTPをHTTPSに転送したい(RewriteRule)

1<IfModule mod_rewrite.c>
2    RewriteEngine On
3    RewriteCond %{HTTPS} off
4    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
5</IfModule>

HTTPでアクセスされたら、同じURLのHTTPSへ301リダイレクトする設定です。

RewriteCond %{HTTPS} offで「HTTPSでないとき」を条件にし、 RewriteRuleで転送先を組み立てます。 mod_rewriteモジュールが有効である必要があります。

リファレンス