ブログ
実務で使える.htaccessまとめ(Apache2.4系〜)
こんにちは、エンジニアの島です。
春めいてきましたね。社内は花粉症ピークをむかえております。
本日はホワイトデーでということで、弊社では男性陣からチョコレートのお返しをいただきました。わーい。
さてさて。
先日担当した案件で、公開前後に.htaccessを使ったアクセス処理をいくつか行ったのですが、
- サーバーさわるし不可視ファイルだしなんかこわい・・・
- ぐぐると書き方いろいろあってわからない・・・
と、露頭に迷う(私のような)人がいればと、まとめてみました。
※ちなみに本記事に登場する例はすべてApache2.4系〜で動作確認済です。
はじめに
.heaccessって?
Apache用の設定上書きファイルです。
「このファイルが置いてある階層以下で、この条件のときこれしてね」という独自処理を追加したい場合に設置します。
.htaccess ファイルの設定ディレクティブは .htaccess ファイルの存在するディレクトリと、そのサブディレクトリすべてに適用されます。
ポイント1
- 不用意に使わない。また管理範囲内のディレクトリで適用する。
- Apacheのバージョンによって、書き方が異なる場合がある。(本記事はすべてApache2.4系〜です)
- まずはテストサイトで動作検証してみる。
- もしもうまく動かなかったら、まずリネームして無効にする。
ポイント2
.htaccessは不可視ファイル(.から始まる拡張子なしのファイル)のため、PCの環境に依っては作成・表示されないことがあります。そこで、
① htaccess.txt
という名前で作成し、
②サーバーアップロード時に .htaccess
にリネームする
というフローで作業をすすめると、ファイル管理の面からもおすすめです。
ひとまず上の2つさえおさえたら。
早速!いってみましょう。
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を作成出来ちゃったりもします。
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} off
=httpsではない場合
を意味します。- うまく動かない場合、レンタルサーバーのサポートに書き方がのっている場合もあるので、参考にしてみてください。(例:さくらのサポート情報)
応用
例えば、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」
皆様の明日の実務に役立ちますように。島でした。