- .htaccessの書き方が知りたい
- .htaccessを分かりやすく解説している記事を探している
- コピペで使える.htaccessのコードを探している
Webサイト運営に携わっていると目にすることになる「.htaccess」というファイル。
httpからhttpsへのリダイレクト設定や、ページ構成に変更があって新しいURLへリダイレクト設定を行いたい。という場合に、.htaccessに辿り着く方が大半でしょう。
この記事では、.htaccessとはそもそも何なのか?という基本をはじめ、具体的な書き方や、コピペで使えるコードを紹介していきます。
記事の後半では、.htaccessの挙動をオンライン上で確かめることができる便利なサービスも紹介していくので、ぜひ有効活用してくださいね。
.htaccessとは
.htaccessとは、Apache(アパッチ)というソフトウェアが使用されているWebサーバ上にて、ディレクトリ単位で設定を制御することができるファイルです。
ちなみに、.htaccessの読み方は「ドット・エイチ・ティ・アクセス」です。
通常Webサイトのページを表示する流れは、Webブラウザから見たいページを要求(リクエスト)し、Webサーバによってその要求に対する結果を返す(レスポンス)という流れになっています。
しかしWebサイトを運用するにあたって、別ページへリダイレクトさせたり、一時的にアクセス制限を掛けたいという状況は度々発生します。
そこで.htaccessをWebサーバ上にアップロードすることで、Webブラウザからのリクエストに対して、Webサーバ上で様々な制御を行うことができるのです。
.htaccessでできること
.htaccessを活用することで、主に以下のような内容を実現することができます。
- httpからhttpsへのリダイレクト
- URLのwwwの有無の設定
- IPアドレスによるアクセス制限
- ユーザ名とパスワードによるアクセス制限
- カスタム404ページの表示
- デバイスごとに表示ページを振り分け
- 特定ディレクトリまたはファイルへのアクセス制限
- 指定の日時になったらサイトを公開及び非公開にする
これだけでも、.htaccessを使うことで様々な制御を行えることが分かりますね。
細かく挙げればその他にもできることがありますが、今回は代表的な例のみを挙げさせていただきました。
.htaccessの書き方【常時SSl化を例に解説】
.htaccessの書き方には決められた文法が存在し、文法の誤りがある場合には「500 Internal Server Error(Webサーバ内部のエラー)」が発生するようになっています。
また、.htaccessによって各ディレクトリの設定を行うには、ディレクティブ(命令、コマンド)と呼ばれる専用の命令を記述する必要があります。
そして使用用途によって記述するディレクティブが異なるので、ここでは.htaccessで頻繁に利用される「httpsへのリダイレクト(常時SSL化)」を例に、.htaccessの書き方を解説していきます。
まずは以下のコードをご覧ください。
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
上記コードは、httpからのアクセスをhttpsへと転送するための設定です。
「RewriteEngine / RewriteCond / RewriteRule」と呼ばれる、URLをリライト / リダイレクトするためのディレクティブを用いて、httpsへのリダイレクト設定を行なっています。
コードの具体的な意味は、次の通りです。
# 1.URL書き換えを有効化
RewriteEngine On
# 2.https以外(http)からのアクセスがあった時に
RewriteCond %{HTTPS} off
# 3.httpsへ301リダイレクト処理を行う
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
初めて見ると多少の嫌悪感を覚えるかもしれませんが、1つずつコードの意味を理解していけば、全く難しい内容ではありません。
RewriteEngine / RewriteCond / RewriteRuleについて
さらに具体的に、前述したコード内に記述されているディレクティブの意味を深ぼると、以下の通りになります。
ディレクティブ | 意味 |
---|---|
RewriteEngine | URLのリライト/リダイレクトを有効化する |
RewriteCond | RewriteRuleを実行するための条件を指定する |
RewriteRule | 正規表現パターンにマッチした場合に指定URLヘのリライト/リダイレクトを行う |
こうして分けて考えてみると、何となく処理の内容を紐解くことができませんか?
「%{ }」で囲まれている「環境変数」について
コード内に「%{HTTPS}、%{HTTP_HOST}、%{REQUEST_URI}」という、「%{}」で囲まれたコードが存在しています。
これは「環境変数」と呼ばれる、様々な情報が格納されている変数です。
環境変数は「%{環境変数名}」で記述することができます。
例えば%{HTTPS}であれば、https通信であるかどうかの情報が格納されており、%{HTTP_HOST}であれば、 ホスト名(ドメイン名)を格納している環境変数になります。
%{REQUEST_URI}については、ドメイン名より後ろの部分の情報が格納された環境変数です。
環境変数 | 意味 |
---|---|
%{HTTPS} | https通信かどうか(ON:https通信 / OFF:http通信) |
%{HTTP_HOST} | ホスト名(ドメイン名) |
%{REQUEST_URI} | ドメイン以下のパス文字列 |
RewriteRuleの文末で使われている[R=301,L]について
RewriteRuleの文末に[R=301,L]という記述がありますが、これらの文字列は「フラグ」と呼ばれるもので、RewriteRuleの文末で設定できるオプションになります。
[R]はRedirectを表していて、[R=301]という記述は、301リダイレクトを行うという意味合いです。
一方[L]はLastを意味し、その行の条件にマッチした場合、それ以降のURI書き換え処理は行わないという意味合いになります。
フラグ | 意味 |
---|---|
R(Redirect) | 指定したURLにリダイレクトを行う。 |
L(Last) | 内容にマッチしたらRewrite処理をその行で止める |
【コピペOK】.htaccessの使用用途別コードサンプル
ここまで一例として、.htaccessによる「http → httpsへの常時SSL化」について解説しましたが、使用用途に応じて記述するべきディレクティブ(文法)は異なってきます。
そこでここから先は、Webサイト運用において頻繁に使われるコードサンプルを、使用用途別にいくつか見ていきましょう。
httpからhttpsへのリダイレクト
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
ディレクティブ | 意味 |
---|---|
RewriteEngine | URLのリライト/リダイレクトを有効化する |
RewriteCond | RewriteRuleを実行するための条件を指定する |
RewriteRule | 正規表現パターンにマッチした場合に指定URLヘのリライト/リダイレクトを行う |
前項で解説したコードと同じですが、復習も兼ねて再度ご紹介です。
処理の流れとしては、まずRewriteEngineでURL書き換えを有効化し、RewriteCondでhttps以外のアクセスがあった際に条件一致させます。
その後、RewriteRuleにてhttpsへのリダイレクト設定を行うという流れになっています。
ドメイン変更時のWebサイト全体のリダイレクト
Redirect 301 / http://new.com/
ディレクティブ | 意味 |
---|---|
Redirect | 古いURLから新しいURLへのリダイレクトを実行する |
Webサイトのドメインを変更した際には、Redirectディレクティブを使うことで、Webサイト全体を新しいドメインへとリダイレクトさせることができます。
正規表現や条件一致を使った、より複雑なリダイレクト設定を行いたい場合は、RewriteRuleディレクティブを使いましょう。
URLのwwwの有無の設定
URLを「www」有りに統一
RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.com$
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]
URLを「www」無しに統一
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.example\.com$
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]
ディレクティブ | 意味 |
---|---|
RewriteEngine | URLのリライト/リダイレクトを有効化する |
RewriteCond | RewriteRuleを実行するための条件を指定する |
RewriteRule | 正規表現パターンにマッチした場合に指定URLヘのリライト/リダイレクトを行う |
RewriteCondによって、wwwの有無を確認し、条件にマッチした場合にRewriteRuleでリダイレクト処理を行うという流れになっています。
ちなみにRewriteRuleで使われている「$1」というのは後方参照を表していて、例えば「http://example.com/hoge.html」にアクセスがあった場合、hoge.htmlの部分が$1に格納されます。
ここで後方参照について詳しく解説すると、記事の主旨とはズレてしまうので割愛します。$1や$2という記述を見かけた際は、後方参照を表しているんだなーという認識を思い返して見てください。
URLから拡張子を省略する
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [L]
ディレクティブ | 意味 |
---|---|
RewriteEngine | URLのリライト/リダイレクトを有効化する |
RewriteCond | RewriteRuleを実行するための条件を指定する |
RewriteRule | 正規表現パターンにマッチした場合に指定URLヘのリライト/リダイレクトを行う |
htaccessでは、URLから「.php」などのファイル拡張子を消すことができます。
上記コード内の最終行である「RewriteRule ^(.*)$ $1.php [L]」の部分で、「.php」拡張子の省略を行なっています。
例えば「sample.php」でアクセスする時、sampleとリクエストするだけで、RewriteRuleにより「sample.php」が参照される仕組みです。
2行目〜3行目のRewriteCondでは、拡張子無しの「sample」というディレクトリやファイルが存在した場合は、そのまま処理を抜けるという条件を設定しています。
4行目のRewriteCondでは、実際に「リクエスト名.php」というphpファイルが存在するかを確認して、存在しなければ処理を抜けます。
Basic認証でWebサイトにパスワード保護する
AuthUserfile "/home/hoge/www/.htpasswd"
AuthName "Please enter your ID and password"
AuthType Basic
Require valid-user
ディレクティブ | 意味 |
---|---|
AuthUserFile | 認証で使うユーザ名とパスワードが記載されたファイルのパスを設定する |
AuthName | Basic認証時に表示される文字列 ※表示されないブラウザもある |
AuthType | 認証タイプを指定(「BASIC」と指定することでBasic認証になる) |
Require | アクセスを可否を設定(valid-userで全てのユーザーに対して認証を有効化する) |
Webサイト全体を、ユーザ名とパスワードによってアクセス制限を掛ける設定です。
Basic認証によるアクセス制限を設定する際には、.htaccessファイル以外に「.htpasswd」という、ユーザ名とパスワードを記述したファイルが必要になります。
.htpasswdにはシンプルに、ユーザ名と”暗号化された”パスワードを、コロン区切りで記述すればOKです。
ユーザ名:暗号化されたパスワード
ここで「暗号化されたパスワード」とお伝えしましたが、Basic認証ではパスワードを暗号化して指定する必要があります。
以下サイトのような暗号化ツールを使うことで、簡単にパスワードの暗号化を行うことができるのでご安心ください。
.htaccessの設置場所と適用範囲について
.htaccessに設定内容を記述した後は、Webサーバ上の任意の場所へアップロードすることで、.htaccessの設定を適用することができます。
その際注意しなければならないのは、「.htaccessの設置場所と適用範囲について」です。
.htaccessは、設置したディレクトリ以下の範囲のみ設定の適用対象になります。
また、.htaccessは複数設置できるファイルなので、各ディレクトリに異なる設定を適用させるといったことも可能です。
例えば以下のようなディレクトリ構造があった時、.htaccessの設置場所に応じた適用範囲はこのようになります。
.htaccessの設置場所に応じた適用範囲
/www
|-- .htaccess # Webサイト全体で有効 ・・・ A
|-- index.html # Aの設定が適用される
|
|-- /hoge
| |-- hogehoge.html # Aの設定が適用される
|
|-- /fuga
|-- .htaccess # fuga配下に対して有効 ・・・ B
|-- fugafuga.html # Bの設定が適用される
上記のように、設置場所を変えるだけで設定の適用範囲も簡単に変えることができるので、特定のページのみ何らかの制限を掛けることも容易な訳です。
.htaccessの挙動をオンライン上でテストする【htaccess Tester】
.htaccessに記述したコードを試す際、いちいちWebサーバ上にファイルをアップロードするのは面倒ですよね。
また、仮にコード内容にミスがあった場合、500 Internal Server Errorが発生してしまったり、本来意図しない挙動を起こしてしまう可能性も考えられます。
そこで、オンライン上にて「htaccess Tester」というツールを使うことで、Webサーバ上に.htaccessをアップロードせずとも、簡易的なテストを行うことができるのです。
https://htaccess.madewithlove.be/
htaccess testerの使い方
htaccess Testerの使い方は簡単で、変換元のURLと.htaccessに記述しているコードを入力後、「Test」ボタンをクリックすることで簡易的なテストを実施することができます。
必要項目を入力し「Test」ボタンをクリックすると、変換後のURLとデバッグ情報を出力してくれるので、この内容を元に正しく.htaccessの設定ができているか確認することができるのです。
とても簡単にテストを行うことができるので、.htaccessを扱い慣れてないうちは、積極的に活用することをオススメします。
最後に
この記事では、.htaccessの基本と書き方(テンプレ含む)を解説しました。
初見だとややこしく感じるかもしれませんが、1つ1つコードの意味を紐解いていくことで、ある程度コツを掴むことができます。
ちなみに.htaccessは、あくまでもApacheの設定ファイルの1つです。
そのためもし仮に.htaccessについて更に詳しく学びたいという方は、Apacheの公式ドキュメントや、Apacheサーバ管理系の書籍を参考にすると良いでしょう。