.htaccess(アクセス制限・許可)書き方について。海外アクセス拒否の方法も

.htaccess(アクセス制限・許可)書き方について。海外アクセス拒否の方法も

.htaccess(アクセス制限・許可)書き方について。海外アクセス拒否の方法も

.htacessファイルを使えばBasic認証などのアクセス制限・許可を掛ける事ができます。

Wordpressサイトのように物理ファイル・ディレクトリが存在しないサイトでもBasic認証は出来ます。

ページ単位やファイル単位での制限・IPアドレス(国内・海外)の制限許可・クローラー巡回やキャッシュの制限など様々な事が可能です。

.htaccessのアクセス制限・許可機能

本記事は、htaccessファイルによる様々アクセス拒否・許可などの制限機能についてご紹介します。

いわゆるBasic認証などのパスワード制限やIPアドレス制限・海外アクセス禁止などがそれにあたりますね。

Wordpressなどでもアクセス制限・Basic認証が可能ですので是非チェックをしてみて下さい。

Basicベーシック認証

Basic認証の画面
Basic認証の画面

Basic認証とは、HTTPで定義される認証方式の一つです。英語の通り「基本認証」と呼ばれるものですね。

Basic認証はユーザー名とパスワードの組み合わせをBase64でエンコードした認証方法です。

パスワードファイルに登録されたユーザー名とパスワードを入力した時のみ、対象ページ表示が許可されます。

セキュリティは低いので注意

この認証方法は、盗聴や改竄がされやすいという欠点がありますが、今でもほぼ全てのWEBサーバーやブラウザで使われている機能です。

私も、公開前のWEBサイトを一般ユーザーが閲覧できないようにこのBasic認証をかける事がよくあります。

また特定のファイルやディレクトリ部分だけに認証を掛ける事もできますので、チェックしておいてください(会員専用ページや、テストページの確認など)。

.htaccessのBasic認証記述

AuthUserFile /var/www/.htpasswd
AuthGroupFile /dev/null
AuthName "Input ID and Password."
AuthType Basic
require valid-user

上記を記述した.htaccessファイルとは別に「.htpasswd」というパスワードファイルを別途準備します。

この.htpasswdファイルに下記のようにユーザー名とパスワードの組み合わせを記述します(複数登録できます)。

lpeg:wvj530Hk1WcUc

.htpasswdパスワードファイルの作り方

本来このパスワードファイルはサーバー内のコマンド操作にて生成ができるようになっています。

しかし一般によく利用されるレンタルサーバー等では、このパスワードファイルが生成実行できない場合があります。

その場合はテキストファイルを作成してFTPでアップロードすれば問題ありません。

.htaccessファイルの作成時と同様、htpasswd.txtからリネームしてOKです。

パスワードは暗号化が必要

ユーザー名はそのままですが、パスワードはそのままでははなく暗号化したものを記載しなければなりません。

パスワードを暗号化してくれる別サイトがあり、IDとパスワードを入力する事で暗号化されたものが表示されます。それをhtpasswdファイルにコピペしましょう。

参考サイト:TECH-UNLIMITED

※.htpasswdはわかりにくいところ配置をした方がいいです。
AuthUserFile /var/www/.htpasswd
参照先はきちんと指定しましょう。

特定のディレクトリだけにBasic認証を掛ける場合

特定のディレクトリだけにこのBasic認証をかけたい場合、基本的にはそのディレクトリのTOPに.htaccessファイルを置く必要があります。

ですので、認証したいディレクトリが複数あるのであればその箇所ごと個別に設置をする必要があります。ここは注意ですね。

WordpressサイトでのBasic認証

Wordpressサイトは、HTMLサイトと違ってhtmlファイルやディレクトリの実物が存在している訳ではありません。

読込された時に初めて区画が展開される訳です。

となると、上で説明した通りに特定ディレクトリに.htaccessファイルを置いたり事はできませんよね。

Wordpressの場合は基本、SetEnvIfでコントロール

そういった常に存在しないディレクトリにもこのBasic認証をかけたい場合があると思います。

その場合はSetEnvIfという構文で対処をします。

SetEnvIfによる具体的な制限・許可の例

サイト全体にはBasic認証を掛けていないが、movieのURIディレクトリだけにはBasic認証を掛ける場合

Satisfy Any
AuthType Basic
AuthName "Input ID and Password."
AuthUserFile /var/www/.htpasswd
require valid-user
SetEnvIf Request_URI "/movie/" secure_dir
Order Allow,Deny
Allow from all
Deny from env=secure_dir

逆にサイト全体にはBasic認証を掛け、movieディレクトリだけはBasic認証を掛けたくない場合

Satisfy Any
AuthType Basic
AuthName "Input ID and Password."
AuthUserFile /var/www/.htpasswd
require valid-user
SetEnvIf Request_URI "/movie/" ok_dir
Order Deny,Allow
Deny from all
allow from env=ok_dir

Wordpress向けのhtaccess記述
Wordpress向けのhtaccess記述

movieのディレクトリにいくと認証画面が表示されました。
movieのディレクトリにいくと認証画面が表示されました。

Satisfy構文

基本としては「Satisfy All」として全体をBasic認証の範囲とするのですが、ここを「Satisfy Any」としています。

「Basic認証」か「許可するディレクトリ」 か、という複数条件になります。

同様に特定のサブドメインや特定のIPアドレスはBasic認証をかけないという複数条件もできます。

Satisfy Any
AuthType Basic
AuthName "Input ID and Password."
AuthUserFile /var/www/.htpasswd
require valid-user
SetEnvIf Host "^sub\." host_ok
Order Deny,Allow
allow from env=host_ok
Allow from 123.456.789.012
Deny from all

上記の「sub」のところにサブドメインが入ります。

IPアドレス・ドメイン拒否、許可

IPアドレス・ドメイン制限

特定のIPアドレスやドメインからのアクセスを拒否したり許可したりできます。

【拒否する場合】

order allow,deny
allow from all
deny from 123.456.789.012
deny from 123.456.7.
deny from example.com

【許可する場合】

order deny,allow
deny from all
allow from 123.456.789.012
allow from 123.456.7.
allow from example.com

ここでの許可・制限の指定の仕方をまとめてみました。

ホスト名 意味
all 全て
123.456.789.012 IPアドレスの完全一致
123.456.789.012/099 IPアドレスの範囲(サブネットマスク)の指定
123.456.789. IPアドレスの先頭一致
example.com 特定ドメインからのアクセスを許可します。
接続元のドメインが example.comに後方一致する場合にのみ接続を許可します。

海外からのアクセスを制限(国内IP許可)

海外からのアクセスを制限する

最近は海外からの訪問ユーザーに見てもらう事自体は珍しくありませんよね。

ブラウザの翻訳機能も充実していますので、グローバル化を進めるためにも今後はより一層外国ユーザーにWEBサイトを訪問してもらう必要があると思います。

しかしWordpressへの不正ログインやアクセス超過を防ぐため、時には制限を掛ける必要がありますよね。

下記が日本国内のみにアクセス許可を出す設定です。

海外IPからのアクセスを制限する設定例

SetEnvIf User-Agent "Googlebot" allowbot
SetEnvIf User-Agent "msnbot" allowbot
SetEnvIf User-Agent "bingbot" allowbot
SetEnvIf User-Agent "Slurp" allowbot

order deny,allow
deny from all

allow from env=allowbot

allow from googlebot.com
allow from google.com

allow from 1.0.16.0/20
allow from 1.0.64.0/18
allow from 1.1.64.0/18
中略
allow from 223.223.224.0/19
allow from 223.252.64.0/19
allow from 223.252.112.0/20

海外アクセス制限の記述の流れ

上記のコードの各行について説明をしていきますね。

【1~4行目】事前に各種検索クローラーのユーザーエージェントを許可項目に入れておきます。

【5・6行目】その上でまずは全てのアクセスを拒否します。

必要なアクセスを許可

【7行目】次にGooglebotなど検索クローラーからのアクセスのみを許可します。

これをしないと検索クローラーがクロールできないため、検索表示自体がされなくなります。

※SEO対策で上位表示ができている場合は要注意ですね。

【8・9行目】またGoogleのSearchConsoleやアナリティクスを使っている場合が、指定のものを許可する必要があります。

日本のIPアドレスを全て許可

【10行目から全て】最後に日本国内からのアクセスを許可します。

最初の方で全てのアクセスを拒否しているため、日本のIPの全て記載する必要があります。

どうやってIPを調べるのか

海外や外国からのアクセスを禁止するため、日本に割り当てられているIPアドレスをAPNICより取得してリスト化しているWEBサイトがあります。

このダウンロードしたファイルにはものすごい数のIPが並びますが、気にせずにそのまま設置してしまいましょう。

http://www.cgis.biz/tools/access/

海外アクセスを制限できているかのチェック

下記サイトに制限をしているURLを入れ、下にある項目から外国を選んでSTARTTESTを押します。

http://www.webpagetest.org/

www.webpagetest.org

表示されたテスト結果の「Screenshot」の欄が404エラーになっていれば、制限されている事になります。

エラーページ
404エラーページの例(赤枠部分)

掲載の時点では「中国」は選択できないのですが、おおよそ問題は無いと思われます。

見られたくない種類のファイルを制限する

テンプレートのディレクトリや設定ファイル・ログなど、一般ユーザーに見られては困るファイルがある場合です。

見られたくないファイルの拡張子を記述する例

<Files ~ ".(log|csv|ini|dat|tpl|yml)$">
deny from all
</Files>

見られたくないファイルとディレクトリをまとめる例

SetEnvIf Request_URI "(\.(txt|dat|csv|ini)|/(data|lib|templates)/)$" ng_dir
Order Allow,Deny
Allow from all
Deny from env=ng_dir

mod_headerによるページキャッシュの拒否

htmlファイルやphpファイルをキャッシュさせない場合の例です。この場合「mod_headers」の記述が必要になります。

<Files ~ "\.(html|php)$">
<IfModule mod_headers.c>
Header set Pragma no-cache
Header set Cache-Control no-cache
Header set Expires "Thu, 10 Dec 2019 16:00:00 GMT"
</IfModule>
</Files>

検索クローラーの巡回拒否設定

検索クローラーの巡回先を拒否するための設定です。

不必要なディレクトリだったり内容がほぼ重複している部分などは、クロールを制限できます。

SetEnvIf User-Agent "Googlebot" blockout
SetEnvIf User-Agent "Slurp" blockout
SetEnvIf User-Agent "msnbot" blockout

order Allow,Deny
Allow from all
Deny from env=blockout

GooglebotはGoogle、SlurpはYahoo、msnbotはBingのクローラーを指しています。

robots.txtでクローラーを拒否する場合

補足情報ですが、こういった検索クローラーの巡回拒否はrobots.txtでおこなう方が多いかも知れません。

「robots.txt」という名前のテキストファイルを作って、ディレクトリTOPに設置をするだけです。

robot.txtの書き方

User-agentの*(アスタリスク)ですべての検索エンジンを拒否できます。

サイト全体をクロール禁止

User-agent: *
Disallow: /

特定ディレクトリだけクロール拒否したい場合

例えばtextディレクトリ以下の全てのページへのクロールを拒否する場合、その後に許可するディレクトリなどを記述していきます。

User-agent: *
Disallow: /test/

Disallowの後に禁止するディレクトリを書きます。

WEBサイトのpdfファイルだけアクセスを拒否する場合

User-agent: *
Disallow: /*.pdf$

この記事をシェアする

一押し人気コーナー紹介