Skip to content

.htaccessファイルの書き方とアクセス制限の設定について

これまでに公開した記事でも何度か取り上げた.htaccessについて、ファイルの書き方や.htaccessを利用したアクセス制限の設定方法について解説しています。

.htaccessファイルとは

一般的にWebサーバーはApache(アパッチ)またはNginx(エンジンエックス)というミドルウェアと呼ばれるものをそれぞれ単体または両方を利用して動いています。

ざっくりした説明ですが、このうちApacheの設定をWebサーバーのディレクトリ単位で制御するためのファイルが.htaccessファイルです。一般的なレンタルサーバーではApacheが利用(あるいはNginxと併用)されており、とくに有料のレンタルサーバーではユーザー側で.htaccessファイルを作成・修正が可能なところが多いです。

Nginxの設定ファイルはnginx.confで、.htaccess(とApacheのおおもとの設定ファイルであるhttpd.conf)とは書き方が異なります。本記事ではNginxについては扱いません。

補足

さくらのレンタルサーバーやエックスサーバーはApache+Nginxの環境で動いていて、.htaccessの利用も可能です。

.htaccessファイルはサーバーの設定を変更するファイルなので、書き方を間違えるとInternal Server Error(500エラー)を引き起こします。ファイルを変更する際はかならずバックアップを取っておき、すぐ戻せるようにしておくとよいです。

なお、.(ドット)ではじまるファイルは、PC上では存在するものの基本的に見た目上は表示されません。作業する際はhtaccess.txtなどとしてテキストファイルとして編集し、サーバーにアップロード後、.htaccessとファイル名を変更してください。

.htaccessファイルの設置場所と影響範囲

.htaccessファイルはサーバーのWeb領域内(/www/public_htmlなどサーバーによって違います)に設置します。また、ディレクトリ単位で.htaccessファイルの設置が可能です。
.htaccessの設定は、ファイルが設置されたディレクトリ内と、その配下のディレクトリにも影響します。

txt
. /public_html
├ .htaccess
├ index.html
├ /about ←影響を受ける
└ /link ←影響を受ける

以下のようにディレクトリごとに公開しているドメインが違うサイトであっても、同じサーバー内にデータがあれば、/public_html直下の.htaccessファイルがディレクトリに影響します。

txt
. /public_html
├ .htaccess
├ index.html
├ /about ←影響を受ける
├ /www.example.jp ←影響を受ける
└ /demo.com ←影響を受ける

/public_html直下に.htaccessファイルが設置されていて、配下のディレクトリにさらに.htaccessファイルが設置されている場合は、/public_html直下の.htaccessの設定と配下ディレクトリの.htaccessの設定が適用されます(同じまたは処理を変えた指示の記述は、近い方の.htaccessの内容が優先されます)

txt
. /public_html
├ .htaccess
├ index.html
├ /about ←/public_html直下の.htaccessが適用される
├ /www.example.jp ←/public_html直下の.htaccessとこのディレクトリ内の.htaccessが適用される
│ └ .htaccess
└ /demo.com ←/public_html直下の.htaccessが適用される

.htaccessファイルを設置したのに該当のディレクトリやページでうまく動作しない場合は、記述ミスのほか親以上の階層にある.htaccessファイルが影響している可能性もあります。

.htaccessファイルの書き方

.htaccessファイルは通常のテキストエディタで作成・編集が可能です。ファイルの文字コードは「UTF-8」を利用します。

以下は記述の一例です。サーバーや書き手によって若干異なる場合もありますが、おおむねの書き方は共通です。

apache
# .htaccess setting file
# Apache/2.4.54

<Files ~ "^\.ht">
  Require all denied
</Files>

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

Apacheには2.2系と2.4系があり、アクセス制限系はそれぞれ記述が異なります。現在ではほぼ大多数のサーバーが2.4系が動いているかと思いますが、各サーバーのApacheバージョンは事前にご確認ください。2.4系でも2.2系の記述は有効なので、バージョンが分からなければ2.2系で記述するのが無難です。

上記の例では以下を行っています。

  • .htからはじまるファイルの直接のアクセスを禁止(2.4系での記述)
  • httpからhttpsへのリダイレクト(SSLリダイレクト)

.htaccessでは、先頭に#(シャープ)をつけるとその行はコメントアウトになります。複数行には対応していないので、複数行をコメントアウトする場合は行ごとに#をつけます。

コメントアウト部分以外の記述は半角英数を使用します。エラーの原因となるため、スペースなど全角文字が入らないように気をつけてください。

.htaccessファイルでのアクセス制限設定

.htaccessファイルでアクセス制限をする方法について解説しています。

.htaccessや.htpasswdファイルへの直接のアクセスを禁止する

.htaccess.htpasswdファイルはサーバーの設定に関係するため、ブラウザからアクセスできてしまうと非常にまずいです。
以下のように記述することで、.htからはじまるファイルにアクセスすることを禁止します。この記述がある場合は、ファイルにアクセスすると403エラーを返します。
とくに理由がなければ、.htaccessファイルの最初に記述しておくとよいです。

apache
# 2.4系
<Files ~ "^\.ht">
  Require all denied
</Files>

# 2.2系
<Files ~ "^\.ht">
  Deny from all
</Files>

すべてのアクセスを拒否する

自分も含め、すべてのアクセスを拒否します。

apache
# 2.4系
Require all denied

# 2.2系
Deny from all

逆にすべてのアクセスを許可する場合は、以下のように記述します。
通常はこの状態なのでとくに記述する必要はないですが、すべてのアクセスを遮断したディレクトリ内で、一部のディレクトリのみアクセスを許可する場合などで利用します。

apache
# 2.4系
Require all granted

# 2.2系
Allow from all

特定のIPアドレスからのアクセスを拒否する

特定のIPアドレスからのアクセスを拒否します。
[IP][HOST])の部分を実際のIPアドレス(ホスト名)に置き換えてください。以降同様です。

apache
# 2.4系
<RequireAll>
  Require all granted
  Require not ip [IP]
  Require not host [HOST]
</RequireAll>

# 2.2系
Order Allow,Deny
Allow from all
Deny from [IP]
Deny from [HOST]

<RequireAll></RequireAll>で囲まれた条件にすべてマッチすればアクセスを許可します。Require all grantedでいったんすべてのアクセスを許可し、以降の記述で拒否するものを指定します。
2.2系ではOrder Allow,DenyAllow from allでいったんすべてのアクセスを許可し、以降の記述で拒否するものを指定します。

複数のIPアドレスやホスト名を指定する場合は、Require not ~(2.2系はDeny ~)を1行ずつ改行して記述します。
Require not host(2.2系はDeny from)でexample.jpを指定すると、サブドメイン(sub.example.jpなど)も含めて対象になります。

逆に特定のIPアドレスからのアクセスのみを許可する場合は以下のように記述します。

apache
# 2.4系
<RequireAny>
  Require ip [IP]
  Require host [HOST]
</RequireAny>

# 2.2系
Order Deny,Allow
Deny from all
Allow from [IP]
Allow from [HOST]

<RequireAny></RequireAny>で囲まれた条件のうち、いずれかにマッチしたもののアクセスを許可します。この記述は省略することが可能です。
2.2系ではOrder Deny,AllowDeny from allでいったんすべてのアクセスを拒否し、以降の記述で許可するものを指定します。

複数のIPアドレスやホスト名を指定する場合は、Require ~(2.2系はDeny ~)を1行ずつ改行して記述します。
こちらもRequire host(2.2系はAllow from)でexample.jpを指定すると、サブドメイン(sub.example.jpなど)も含めて対象になります。

IPアドレスの指定について

IPアドレスの指定には、以下のパターンが使用できます。スパムのIPアドレスで前方が同じものを拒否する場合は、前方一致で指定すると便利です。

  • 完全なIPアドレス:192.168.0.0のように指定する(ピンポイント)
  • IPアドレスの前方一致:192.168.0.のように指定する(192.168.0.からはじまるIPアドレスが対象)
  • サブネットマスクを利用:192.168.0.0/24のように指定する(192.168.0.0192.168.0.255の範囲のIPアドレスが対象)

メディアファイルなどを検索エンジンクローラーのクロールから除外する

こちらの記事でも書いた検索エンジンのクローラーから画像やPDFファイルなどをクロール対象外とする記述です。

apache
<Files ~ "\.(xml|mp4|pdf|jpe?g|gif|png|webp)$">
  Header set X-Robots-Tag "noindex, nofollow, noarchive"
</Files>

特定のファイルのみ、特定の拡張子のみの場合は、以下のように指定します。

apache
# 特定のファイルのみ
<Files "sample.pdf">
  Header set X-Robots-Tag "noindex, nofollow, noarchive"
</Files>

# 拡張子がpdfのファイルのみ
<Files ~ "\.pdf$">
  Header set X-Robots-Tag "noindex, nofollow, noarchive"
</Files>

本記事の解説は以上です。