.htaccessができること

もくじ > Web開発ノート > WordPress

WordPressのサイトをいくつか作っているうちに必然的にPHPについても詳しくなってきます。そして管理画面にBASIC認証をかけたり、httpsにリダイレクトさせたりといった技も覚えるようになります。

BASIC認証やリダイレクト、アクセス制限などをプラグインに任せていると、何かしらPHPにエラーが紛れこんでWordPressの管理画面が開かなくなった時にお手上げ状態になってしまいます。そんな事にならないように、FTPなどでサーバ上に直接ファイルを設置する方法を覚えてしまいましょう。

ここではサーバ上に設置する.htaccessファイルを使って何ができるのかをまとめてみました。

アクセス制限

BASIC認証

.htaccessを設置したディレクトリに対して、IDとパスワードを入力しないとアクセスできないようにします。認証をかけたいディレクトリに以下の2つのファイルを設置します。

.htaccess
.htpasswd

.htaccessファイルには以下の内容を記述します。

AuthType Basic
AuthUserFile /フルパス/.htpasswd
AuthName "IDとパスワードを入力してください"
require valid-user
order deny,allow

AuthUserFileは.htpasswdファイルへのフルパスを記述し、AuthNameには認証画面で表示するテキストの内容を書いてください。

.htpasswdにはユーザー名を暗号化したパスワードを記述します。以下の例ではIDはmyname、パスワードは1234です。

myname:8dc80AKRUCUhU

パスワードの暗号化は、crypt関数でハッシュ化してください。と言ってもわからない時は、契約しているサーバのコントロールパネルとかで生成するか、htpasswd 生成とかで検索して暗号化してください。

IPアドレスによる制限

指定したIPアドレスからのアクセスだけを許可する事ができます。以下の例ではadmin.phpというファイルへのアクセスを指定したIPアドレスからのみ許可しています。

<Files admin.php>
order deny,allow
deny from all
allow from ###.###.###.#### ←IPアドレスを指定
allow from ###.###.###.#### ←複数指定する事もできます
allow from pikodon.com ←ホスト名を指定する事もできます
</Files>

逆に特定のIPアドレスやホスト名からのアクセスを拒否する事もできます。以下の例では.htaccessファイルを設置したディレクトリへのアクセスを拒否しています。

order allow,deny
allow from all
deny from ###.###.###.#### ←IPアドレスを指定
deny from pikodon.com ←ホスト名を指定する事もできます

プログラムから参照する外部プログラムなど、特定ファイルに対して全てのHTTP経由のアクセスを拒否したい場合は以下のように書きます。

<Files program.php>
deny from all
</Files>

リダイレクト

.htaccessでは、設置したディレクトリや、指定したファイルへのアクセスを301リダイレクトさせる事ができます。以下の例ではold.htmlへのアクセスをnew.htmlにリダイレクトします。

RewriteEngine on
RewriteRule ^/old.html$ https://pikodon.com/new.html [R=301,L]

ファイルではなくディレクトリをリダイレクトさせたい場合は、以下のように記述します。この例では/old/を/new/にリダイレクトさせています。

RewriteEngine on
RewriteRule ^old(.*)$ /new$1 [L,R=301]

URLパラメータをディレクトリ名に変換してリダイレクトする事もできます。例えば、
https://pikodon-oldweb.com/admin/login.php?id=123456789

https://pikodon.com/login/123456789/
このようにURLを変更する場合は以下のように記述します。

RewriteEngine On
RewriteCond %{QUERY_STRING} id=(.*)$
RewriteRule ^admin/login.php$ https://pikodon.com/login/%1/? [R=301,L]

URLの正規化

301リダイレクトを応用して、URLの正規化をする事ができます。例えば、以下の例ではwwwのあるURLをwwwなしに統一させています。

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]

httpからhttpsへのリダイレクト。

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

https://pikodon.com/index.htmlからindex.htmlを省略したhttps://pikodon.com/に統一する。

RewriteEngine on
RewriteCond %{THE_REQUEST} ^.*/index.html
RewriteRule ^(.*)index.html$ https://pikodon.com/$1 [R=301,L]