【.htaccess】httpからhttpsへリダイレクト、wwwありなし統一、index.html(php)ありなし統一の設定方法&記述内容の意味

www.の有無。
http://、https://暗号化の有無。
index.html(index.php)の有無。

これらを .htaccessファイルで設定することにより、URLの正規化を行うことができます。その設定方法と記述内容の意味を解説していきたいと思います。

.htaccess(ドットエイチティーアクセス)とは?

.htaccess ファイル(分散設定ファイル)は、サイトの管理者が「Apache(アパッチ)」の各種設定や制御を行えるようにしたファイルで、ディレクトリ単位で設置・設定が行えます。

ほぼ全てのレンタルサーバーで、この「Apache」を採用しています。

通常 Apache は、httpd.conf というテキストファイルにディレクティブと呼ばれる専用の命令を記述することで設定しますが、httpd.conf はサーバー管理者しか編集できません。それに対して、.htaccess ファイルは各ユーザーが、各ディレクトリ単位で設定することができます。

有効範囲

.htaccess をルートディレクトリ(public_html)に配置すると、Webサイト全体に対して有効になります。 階層別にそれぞれ配置した場合は、より深い階層に配置した .htaccess の設定が優先されます。下位階層の設定を一部分だけ変更したい場合は、その階層の .htaccess に記述した設定のみが上書きされ、その他の設定は上位の階層の設定が有効になります。

# コメント

コメントは、行頭に「#」をつけます。行の途中でコメントアウトする場合は、「” ”(ダブルクォート)」で囲みます。

# ここにコメント
Options -Indexes "# 行の途中でコメントするのはなるべく避けましょう"

WordPress を利用している場合

まずはじめに注意点として、WordPress を利用している場合は、必ず次のようなWordPressのリダイレクト設定が書かれている場所の上に追加するようにしてください。

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

.htaccessの保護

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

.htaccessファイルへのアクセスをすべて拒絶します。セキュリティを高める設定です。

wwwあり・なし統一

wwwなしの方がURLが短縮されてスッキリしますが、中古の独自ドメインを取得する際には、SEO の観点から過去にwwwありなしのどちらに統一して使われていたのか調べた方が良いです。過去に運用されていた方に合わせると、SEO 効果を引き継ぐことができます。

www 無しの場合

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

www 有りの場合

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

mod_rewriteが利用できる環境かどうかを確認しています。利用できない環境でmod_ rewriteのコードを記述するとエラーが発生してしまうので、利用できるか確認を行っています。

RewriteEngine on

mod_rewriteを利用するときに使う宣言文です。まずは Rewrite 機能をONにして URL の書き換えを可能にします。Rewrite機能とは、アクセスのあった URL を正規表現で書き換えてから処理する機能です

RewriteCond

RewriteCond は、URL書き換えを行う条件の指定。

RewriteRule

RewriteRule は、書き換えが行われる状態を指定。RewriteCond の条件が満たされれば、RewriteRule に記述したことが実行されます。

RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]

RewriteCond %{変数名} 正規表現 [オプション]

%{HTTP_HOST}でホスト名「例:hyde.work」の部分を取得しています。

^は行頭、「先頭はここです」というのを表します。

\.\は、.に対してエスケープ文字を使用し、.が特別な意味を持たないようにしています。つまり、「任意の一文字」という意味ではなく、「ドット」を意味します。

(.*).は、何か1文字、何でもいい1文字。*は直前の文字を0回以上繰り返す。()はその中に当てはまる文字列をグループ化しています。

(.*)は、何でもいい1文字を、0回以上繰り返す。つまり、あらゆる文字列を表現できます。ここで()を使用しているのは、RewriteRuleの後方参照で「%1」に使用するためです。

[NC]は「No Case」の略。大文字(A-Z)と小文字(a-z)を区別しないという意味です。www も WWW も Www でも同じ扱いになります。つまり、ここで指定している条件は「もしホスト名がwww.(WWW.)という文字列で始まる記述で指定されていたら」という意味になります。

RewriteRule ^(.*)$ https://%1/$1 [R=301,L]

RewriteRule (正規表現) (置きかえるURL) [オプション]

「^」は行頭、「$」が行末という意味です。

「(.*)」は「0文字以上の任意の文字。カッコでくくり後方参照の$1とすることで、$1にはページ名が入ります。

https://%1/$1で、wwwなしのアドレスに変更しています。%1は、さきほどRewriteCondの方で指定した(.*)に置換されます。つまり、http://www.hyde.work と指定した場合の「hyde.work」に置換されます。

[R=301]は、「301リダイレクト」することを意味します。[L]は LAST、処理終わりの意味。「適用したルールの終了」という意味になります。

[L,R]にすると302リダイレクトになるので、301リダイレクトを行いたい場合は、必ず[L,R=301]の指定をするようにします。

301リダイレクトと302リダイレクトの違い
301永久に移動するという意味を持つ。引っ越しやページ移動のときに使用。
302一時的に移動するという意味を持つ。メンテナンスページや期間限定のキャンペーンページなどに使用。

httpからhttpsへリダイレクト

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>
%{HTTPS} off

%{HTTPS} offは「httpsではない場合」という意味。

^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

^(.*)$は、すべてのアクセスを意味します。

https://は、HTTPSプロトコル。%{HTTP_HOST}は、ドメイン名。%{REQUEST_URI}は、Webページのパス。

次に http を https に変換し、それ以外のホスト名(%{HTTP_HOST)やページ名(%{REQUEST_URI})は現在のものをそのまま使用しています。

index.html(php)ありなし統一

<IfModule mod_rewrite.c>
RewriteCond %{THE_REQUEST} ^.*/index.(html|php)
RewriteRule ^(.*)index.(html|php)$ https://%{HTTP_HOST}/$1 [R=301,L]
</IfModule>

RewriteRule ^(.*)index.(html|php)$ https://%{HTTP_HOST}/$1 [R=301,L]/が無いと、WordPress の管理画面で「ホーム」へのリンクを押すとエラーになってしまいます。

まとめて書く

※ wwwなし、httpsリダイレクト、index.html(php)なし

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

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

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

RewriteCond %{THE_REQUEST} ^.*/index.(html|php)
RewriteRule ^(.*)index.(html|php)$ https://%{HTTP_HOST}/$1 [R=301,L]
</IfModule>

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

まとめて書く場合は、RewriteEngine Onは最初に1回記述するだけで大丈夫です。

記述する順番に注意

wwwありなしの記述をした後にhttps化の記述をします。順番を逆にするとエラーになり、下記のメッセージが表示されてしまいます。

このページは動作していません
www.hyde.work でリダイレクトが繰り返し行われました。

その他の用語解説

Options +FollowSymLinks

Optionsは、動作に関する設定です。

FollowSymLinksは、シンボリックリンクを有効にするという設定です。記述が不要の場合もあります。ここでは省いて解説しました。

SymLinksIfOwnerMatchは、さらにセキュリティを高めた「ファイルの所有者に限りシンボリックリンクを有効にする」という設定です。

Symlinksは、CPIサーバーを利用する場合記述が必要です。CPIサーバー以外でも、mod_rewriteを有効にし、エラーがでる場合は、どちらかのオプションを有効にしてください。

CPIサーバーでACE01_2015以降のサーバー

Options +SymLinksIfOwnerMatch

CPIサーバーでACE01_2011以前のサーバー

Options +FollowSymLinks

RewriteBase /

.htaccess が設置されたディレクトリを基準にします。転送元ではなく、転送先のURLを基準にします。ドキュメントルートに設置する場合は省略しても構いません。「/」は、ドキュメントルートから始まることを表します。

まとめ

2014年にGoogleが常時SSL化の推奨を発表したことにより、無料で常時SSL化の提供サービスを行うレンタルサーバーや無料ブログもだいぶ増えてきました。また、SEO の観点からも www ありなしの統一など URL の正規化を行うことをお勧めします。

コメント