実務で使える.htaccessまとめ(Apache2.4系〜)

Blog

こんにちは、エンジニアの島です。

春めいてきましたね。社内は花粉症ピークをむかえております。
本日はホワイトデーでということで、弊社では男性陣からチョコレートのお返しをいただきました。わーい。

さてさて。
先日担当した案件で、公開前後に.htaccessを使ったアクセス処理をいくつか行ったのですが、

  • サーバーさわるし不可視ファイルだしなんかこわい・・・
  • ぐぐると書き方いろいろあってわからない・・・

と、露頭に迷う(私のような)人がいればと、まとめてみました。

※ちなみに本記事に登場する例はすべてApache2.4系〜で動作確認済です。

はじめに

.heaccessって?

Apache用の設定上書きファイルです。
「このファイルが置いてある階層以下で、この条件のときこれしてね」という独自処理を追加したい場合に設置します。

APACHE

.htaccess ファイルの設定ディレクティブは .htaccess ファイルの存在するディレクトリと、そのサブディレクトリすべてに適用されます。

ポイント1

  • 不用意に使わない。また管理範囲内のディレクトリで適用する。
  • Apacheのバージョンによって、書き方が異なる場合がある。(本記事はすべてApache2.4系〜です)
  • まずはテストサイトで動作検証してみる。
  • もしもうまく動かなかったら、まずリネームして無効にする。

ポイント2

.htaccessは不可視ファイル(.から始まる拡張子なしのファイル)のため、PCの環境に依っては作成・表示されないことがあります。そこで、
htaccess.txt という名前で作成し、
②サーバーアップロード時に .htaccess にリネームする
というフローで作業をすすめると、ファイル管理の面からもおすすめです。

ひとまず上の2つさえおさえたら。
早速!いってみましょう。

  1. BASIC認証
  2. 301リダイレクト
  3. URLの正規化
  4. 正ドメイン以外のアクセス拒否

BASIC認証

ディレクトリにアクセスする際、認証を行います。
認証用ファイル(.htpasswd)に記載の内容と一致した場合にアクセスが許可されます。
ユーザーだけでなく、Googleのクローラーのアクセスも防げます。

公開前にはBASIC認証をかけましょう。

利用シーン

  • 公開前サイト・テストサイト
  • 特定の人にしか見せたくないページ(会員限定ページなど)

手順①:設定ファイルの作成

BASIC認証を行うには、.htaccessだけでなく、パスワード用に.htpasswdというファイルも用意します。

htaccess.txt

<Files ~ "^\.(htaccess|htpasswd)$">
deny from all
</Files>

AuthUserFile /home/foo/bar/.htpasswd
AuthName "Please enter your ID and password"
AuthType Basic
require valid-user 
order deny,allow

htpasswd.txt(ID:shima Password:shima で作成した場合)

shima:rfUv8zv0DeeOY

.htpasswdは、こちらのサイトなどで簡単に作成できます。

ポイント

  • .htaccess用ファイル作成の際は、最後に改行を入れるのを忘れないようにしましょう。
  • 認証ファイルへのパス /home/foo/bar/.htpasswd は、サーバーのルートディレクトリからの.htpasswdへのフルパス(Macでいうと /usr/local/... とか /home/pass/... とか)を指定します。
    ※フルパスは、サーバーの契約書類かphpinfo等の表示内容で確認しましょう。

うっかりドキュメントルートから書くとサーバーのルートを参照してしまいます。
.htaccessはセキュリティ上、ドキュメントルート( http://〇〇〇.jp/ )より上の階層に置くことが多いことを考えると、フルパスで書く理由が腑に落ちますね。

解説・その他(おまけ)

  • 上3行 <Files ~ "^\.(htaccess|htpasswd)$"></Files> は、「htaccess、htpasswdというファイルは、すべてのアクセス(all)を拒否(deny)します」という意味になります。いじられたら困りますものね、決まり文句みたいなものと思いましょう。
  • .htpasswd はサーバーによっては暗号化の方法が異なる場合があります。(MD5/SHA-1 など)※参考

手順②:ファイルアップロード

上記2つを作成したら、BASIC認証をかけたいディレクトリに、先ほどの2ファイルをアップロードします。
アップロードが完了したら、

  • htpasswd.txt.htpasswd
  • htaccess.txt.htaccess

にリネームします。

手順③:動作確認

該当ページにアクセスして動作確認しましょう。
アクセス時にid/passの入力を求められ、設定した値でログインできればOKです。

うまく動かないとき

表示/動作がおかしい場合は、.htaccessを一度無効にして(_.htaccessなどにリネーム)、下記を確認してみてください。

  • ID、パスワードを求められない場合 ⇒ .htaccessファイルが間違っている可能性あり
  • パスワードが通らない場合 ⇒ フルパスもしくは.htpasswdファイルが間違っている可能性あり

その他(おまけ)

下記のサイトを使うと、簡単に.htaccessと.htpasswdを作成出来ちゃったりもします。

htaccess Editor

301リダイレクト

301=恒久的な転送を意味します。
デフォルトだと302(=一時的な転送)になるので、サイト引っ越しのときなどは301を明示します。
Googlebotが認識すると、インデックスを貼り替えてくれます。

利用シーン

  • クローズしたサイトにアクセスされたとき、別サイトに転送したい
  • 旧サイトのページURLと新サイトのページURLが異なるので転送したい

設定ファイル作成

下記は、同一サイト内での転送(『旧サイトではお知らせ用のディレクトリが/news/だったのが、新サイトでは/topics/になった』という場合)の記述です。

htaccess.txt

<Files ~ "^\.(htaccess|htpasswd)$">
deny from all
</Files>

<IfModule mod_rewrite.c>
RewriteEngine on

RewriteBase /
RewriteRule ^news/(.*)$ /topics/ [R=301,L]
RewriteRule ^privacy/(.*)$ /privary/policy/ [R=301,L]

</IfModule>

ポイント

下記がリダイレクトの基本構文です。

<IfModule mod_rewrite.c>
RewriteEngine on

RewriteBase /
RewriteRule 転送前 転送後 [R=301,L]

</IfModule>
  • 転送したいページ分、改行して RewriteRule を追加していきます。
  • 転送先が別サイトの場合、 RewriteRule ^news/(.*)$ http://〇〇〇.com/topics/ [R=301,L] というふうに指定します。

解説・その他(おまけ)

  • RewiteBase / にはベースとなるディレクトリを意味します。特に指示がない場合/
  • ^news/(.*)$ 部分はPCRE形式の正規表現を使用して、「news/以下にアクセスされたらとにかくtopics/にとばしてね」という処理をしていますが、個別に書いてももちろん良いです。
  • mod_rewriteが使えない場合はRedirect ディレクティブを使った転送方法もあります。

作成できたら、サーバーにアップロード→リネームして、動作を確認しましょう。

URL正規化

アスセスを一本化したい場合の転送設定です。
先ほど同様、mod_rewriteを使います。
SSL対応の際は、301を明示することでもとのURLのページ評価を引き継がせましょう。

利用シーン

  • wwwなしでアクセスされたとき、wwwありのドメインにとばす(サブドメイン転送)
  • http://でアクセスされたとき、https://にとばす(SSL対応)

設定ファイル作成

下記はSSL対応の例になります。

htaccess.txt

<Files ~ "^\.(htaccess|htpasswd)$">
deny from all
</Files>

<IfModule mod_rewrite.c>
RewriteEngine on

RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://〇〇〇.com/$1 [R=301,L]

</IfModule>

解説・その他(おまけ)

  • RewriteCond =リライトルールを適用する条件。 %{HTTPS} offhttpsではない場合 を意味します。
  • うまく動かない場合、レンタルサーバーのサポートに書き方がのっている場合もあるので、参考にしてみてください。(例:さくらのサポート情報

応用

例えば、301リダイレクトも書きたいし、SSL対応もしたい、といった場合にリライトルール以外の記述は1つにまとめても大丈夫です。

<Files ~ "^\.(htaccess|htpasswd)$">
deny from all
</Files>

<IfModule mod_rewrite.c>
RewriteEngine on

# HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://〇〇〇.com/$1 [R=301,L]

# PAGE
RewriteBase /
RewriteRule ^news/(.*)$ /topics/ [R=301,L]
RewriteRule ^privacy/(.*)$ /privary/policy/ [R=301,L]

</IfModule>

といった具合になります。

正ドメイン以外のアクセス拒否

DNSの仕組み上、ドメインにIPを割り振られた場合、容易にミラーサイトが立てられてしまいます。
あまり使うことはないかもしれませんが、ミラーサイト防止対策として、正ドメイン以外だったらサイトを表示させないようにします。

利用シーン

  • 正ドメイン以外のアクセスをはじきたい

設定ファイル作成

構文は、上記URLの正規化と同様です。ステータスコード400(=Bad Request)を返却してサイトの閲覧を禁止します。

htaccess.txt

<Files ~ "^\.(htaccess|htpasswd)$">
deny from all
</Files>

<IfModule mod_rewrite.c>
RewriteEngine on

RewriteCond %{HTTP_HOST} !^〇〇〇.com$
RewriteRule ^(.*)$ - [L,R=400]

</IfModule>

解説・その他(おまけ)

  • 「正ドメインでなかったら」はじきたいので、!^〇〇〇.com$ には正ドメインを書きます。(弊社サイトの場合、RewriteCond %{HTTP_HOST} !^www.evoworx.co.jp$ といった具合になります)

春の一句
「コピペから 使ってみるべし .htaccess」

皆様の明日の実務に役立ちますように。島でした。