.htaccess 設定まとめ
目次
- .htaccessファイルとは?
- 作成方法
- 保存する場所
- wwwあり/なしでの設定方法
- URLの正規化(index.phpを非表示)
- リダイレクト設定
- 正規表現について
- フラグについて
- 環境変数について
- スマホサイトとPCサイトを自動振り分け
- 404ページをリダイレクトさせる
- htpasswdの設定
- 備考
.htaccessファイルとは?
.htaccessは、PHPでのphp.iniやhttpd.confのように、WEBサーバー上での設定を更新できる設定ファイルのひとつです。
httpd.confファイルがApacheの設定ファイルなので、httpd.confの下位のファイルである.htaccessもApacheの設定ファイルとして使用します。なので、レンタルサーバーなどによってhttpd.confの設定を変更できない場合は.htaccessが動かない場合もあります。
.htaccessの書き方には独自のルールが有ります。記述方法を間違えるなど、.htaccessが原因でページが表示されない場合は500エラーが発生します。
.htaccessの役割は地味ですが、設定しておいて損はないでしょう。
作成方法
基本的にすでにサーバー上にある.htaccessファイルをベースに作っていくので新規で作成ということはしませんが、新規で作成する場合はテキストファイルをベースにして作成します。
ちなみに.htaccessの最初についているドットはUNIXでの慣習らしく、設定ファイルであることを意味しているのですが、windows環境では拡張子のみのファイル名なしファイルは作成できないので、.htaccessという名前が使えません。
その場合はhtaccess.txtというファイル名で一旦保存し、サーバーにアップしてからファイル名を変更します。
通常はサーバーにある.htaccessファイルをダウンロードして追記していきます。
保存する場所
.htaccessファイルの設定をウェブサイト全体に設定を適用する場合は、トップページの置いてあるディレクトリにファイルを保存しておきます。
.htaccessの有効範囲はファイルの置いてあるディレクトリ内と、それ以下のサブディレクトリ内すべてなので、特定のページのみに設定を適用させたい場合は、そのファイルのあるサブディレクトリ内に保存します。
.htaccessファイルが複数ある場合は、上位ディレクトリでの設定は上書きされ、下層ディレクトリに配置したものが優先されます。
wwwあり/なしでの設定方法
URLのhttp://のあとのwwwの部分はホスト名というのですが、サーバーによっては省略可能です。
逆に必ず表示されるようにも設定することができますが、どっちのほうが良いとかはないそうです。
wwwありの場合
RewriteEngine On
RewriteCond %{HTTP_HOST} ^example\.com
RewriteRule (.*) http://www.example.com/$1 [R=301,L]
wwwなしの場合
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.example\.com
RewriteRule (.*) http://example.com/$1 [R=301,L]
※example.comは任意で変更してください。
ページにアクセスができなくなってうまくいかない場合は下記の記述をRewriteEngine onの前に追加して試してください。
Options +FollowSymLinks
URLの正規化(index.phpを非表示)
例えば、http://www.example.com とhttp://www.example.com /index.phpでは同じページが表示されますよね。
一方で、サーチエンジンによってはこの2つが別々のページとして認識されてしまい、SEO的に不利になってしまう場合があります。(最近は改善されてきているそうですが)
このように、全く同じコンテンツが複数ある場合に、どちらがオリジナルのものかを明確にすることをURLの正規化と呼びます。
index.phpを省略させる記述は以下のとおり。
RewriteEngine On
RewriteCond %{THE_REQUEST} ^.*/index.php
RewriteRule ^(.*)index.php$ http://example.com/$1 [R=301,L]
※example.comは任意で変更してください。
また、使い所はないかもしれませんが、index.htmlとindex.phpの両方を省略させたい場合下記の記述に変更してください。
RewriteEngine On
RewriteCond %{THE_REQUEST} ^.*/index.(html|php)
RewriteRule ^(.*)index.(html|php)$ http://example.com/$1 [R=301,L]
リダイレクト設定(長いです)
リダイレクトとは、ページの削除やサイトの転移があった場合に、新しいページに自動で転送を行う処理のことです。
リダイレクト設定は正しい手順で対応しなければ、SEO面でのペナルティを受けてしまい、検索順位の下降などを引き起こしてしまうので、正しい方法で対応する必要があります。
ページをリダイレクトさせる方法はいくつかありますが、.htaccessを使った301リダイレクトの方法が最も確実です。
301リダイレクト
301リダイレクトを使うと、新しいドメインに誘導させる際に古いドメインでの検索順位などの情報を引き継ぐことができます。
先ほどのwwwのあり/なしの設定やURLの正規化の設定は、301リダイレクトを使用して操作していました。
301リダイレクトでの設定はRewriteで始まる「mod_rewrite」を使うのが特徴です。
mod_rewriteはサーバーによって利用できない環境があるようで、その場合にmod_rewriteを読み込んでしまうと500エラーが発生してしまいます。以下のif文でmod_rewriteを囲うことで対処します。
<IfModule mod_rewrite.c>
# ここにmod_rewriteを記述
</IfModule>
mod_rewriteが使用できない場合、このif文で囲まれている記述は無視されます。
RewriteEngine
301リダイレクトを行う際は、RewriteEngine Onと記述してRewrite機能をオンにしておきます。
RewriteEngineは一回onにすれば、その後はオンになったままなので、何度も記述する必要はありません。
RewriteRule
RewriteRuleは、主にURLの書き換えを行います。
RewriteRule A B [C]という形をしていて、「Aというアクセスがあった場合はCのフラグでBに転送しろ」という命令をしています。
先ほどのwwwなしをありに変換したコードを例に解説しますと、
RewriteEngine On
RewriteCond %{HTTP_HOST} ^example\.com
RewriteRule (.*) http://www.example.com/$1 [R=301,L]
Aが(.*)に、Bがhttp://www.example.com/$1に、Cが[R=301,L]に置き換わるので、
「(.*)というアクセスがあった場合は[R=301,L]のフラグでhttp://www.example.com/$1に転送しろ」と置き換えられます。
よくわからないので上から順に見ていきましょう。
まずRewriteEngine OnでRewriteRuleを使えるようにします。
その下のRewriteCondは条件式です。この条件に当てはまった場合のみ直後のRewriteRuleが実行されます。
%{HTTP_HOST}はホスト名を取得する働きがあります。
見慣れない書き方をしていますが、これは環境変数というもので、%{環境変数名}という形をとります。
つまり、ホスト名とexample.comが一致していれば条件に当てはまるということです。
そして、最後のRewriteRuleでURLを書き換えています。
(.*)は正規表現という記述方法で対象となる文字列を表しています。
ドット(.) は文字全てを、アスタリスク(*)は0文字以上の繰り返しを意味していて、アクセスされたパスが0文字以上(=実質全て)の場合に、http://www.example.com/$1への転送を行います。
$1という変数は(.*)の中身を格納していて、転送する際に置き換えられます。(これを後方参照といいます。)
最後の[R=301,L]はフラグという、オプションみたいなものです。
ここではR=301とLのフラグを指定しています。
R=301はRedirect=301の略で、指定されているURLに301リダイレクトさせるフラグです。
LはLastの略で、URLの書き換え処理を終了し、以降のルールは実行しないというフラグです。
RewriteBase
RewriteBaseは相対パスを使うときのベースとなるディレクトリの変更を指定します。
指定をしない場合は、実行している.htaccessファイルの場所がベースとなります。
RewriteCond
先ほどもRewriteCondは登場しましたが、改めて説明します。
RewriteCondはRewriteRuleで指定したURLを書き換える条件をさらに細かく指定できます。
RewriteCondはリダイレクトの無限ループを防ぐための条件式として利用されます。
RewriteRule は条件に一致すると先頭行から再探索を行う特性がありますが、その際RewriteCondの条件に一致しなかった場合は直後のRewriteRuleは実行されないためです。
条件式の形はRewriteCond A B Cとなっており、Cはパターン/オプションを表しています。
AとBがCのパターン/オプションでtrueを返す場合、条件に一致します。
Cのパターン/オプションを指定しない場合はA = Bの場合trueを返します。
Cのパターン/オプションを指定するとAとBの一致条件を変更できます。
Cのパターン/オプションは以下の通りです。
パターン名 | 説明 |
---|---|
! | AがBと不一致ならtrue を返します。 |
< | AとBを数値、または辞書順として比較を行い小さければtrueを返します。 |
> | AとBを数値、または辞書順として比較を行い大きければtrueを返します。 |
= | AとBを数値、または辞書順として等価比較を行い等しければtrueを返します。 |
-d | Aのディレクトリが存在すればtrueを返します。 |
-f | Aのファイルが存在すればtrueを返します。 |
-s | Aのファイルが存在し、サイズが0byteでなければtrueを返します。 |
-F | Aに対してアクセス可能なパスであればtrueを返します。 |
-U | Aに対してアクセス可能なURLであればtrueを返します。 |
オプション名 | 説明 |
---|---|
[OR] | 連続する RewriteCond のいずれかがtrueの場合に実行します。 省略時はANDの関係になります。 |
[NC] | 条件の'A-Z'と'a-z'を区別しないようにします。 |
Redirect permanentについて
URLの書き換えの方法にRedirect permanentを使う方法があります。
RewriteRuleに比べると比較的簡単な記述で設定できます。
mod_Rewriteが使えないレンタルサーバーの場合はこちらを使うことがあるかもしれません。
デメリットとしては正規表現やフラグが使えないことや、無限ループが発生しやすいことが挙げられます。
Redirect permanent /example/ http://example.com/sample/
正規表現について
RewriteRuleやRewriteCondの特徴として、正規表現が使用できます。
正規表現というのは、いくつかの文字列を1つの形式で表現する記述方法です。
RewriteRule ^(.*)/?send/?$ http://local-doe/ [R=301,L]
例えば、上記のRewriteRuleでは正規表現を使用してリダイレクトを行っています。
ぱっと見、暗号のようですが、ひとつの法則に従って働いています。
RewriteRule A B [C]で見るとAは^(.*)/?send/?$、Bはhttp://local-doe/、Cは[R=301,L]となります。
Aの^(.*)/?send/?$は「名前がsendのサブディレクトリ」を示しています。
^は「先頭」を意味していて、$は「末尾」を意味しています。
(.*)は0文字以上(=実質全て)の文字列を意味していて、意図としてはホスト名がhttp://example.comであってもhttp://www.sample.orgであっても条件に一致させるために記述しています。
そして/?という記述は参照リンクのApacheのRewriteを設定する前に知っておくべきことを参照してください。意味としてはスラッシュが0か1の場合を示しています。
Bのhttp://local-doe/はリダイレクト先です。DOEのホームページを設定しています。
そしてCはRewriteRuleの項(リンク)でも登場しましたが、フラグというオプションです。
参照:ApacheのRewriteを設定する前に知っておくべきこと
フラグについて
フラグを使うと、RewriteRuleの挙動を制御することができます。
以下は代表的なフラグの一覧です。
シンタックス | フラグ名 | 説明 |
---|---|---|
REDIRECT | [R=CODE] | 指定したURLに外部リダイレクトする。指定しない場合は302 (MOVED TEMPORARILY)が使われます。[R=301]のようにレスポンスコードを指定することもできます。 |
CHAIN | [C] | 条件に一致すると、次のRewriteRuleの処理を連続で行います。 |
FORBIDDEN | [F] | HTTPレスポンスの403(FORBIDDEN)を返します。 |
GONE | [G] | HTTPレスポンスの410(GONE)を返します。 |
LAST | [L] | URLの書き換え処理を終了し、それ以降のRewriteRuleを適用しないようにします。 |
NO CASE | [NC] | 条件の'A-Z'と'a-z'を区別しないようにします。 |
環境変数について
%{HTTP_HOST}や%{THE_REQUEST}は環境変数と呼ばれるグループに分類されます。
ブラウザでサーバにアクセスする際、HTTPリクエストヘッダに各種の情報を含めて送信しています。
HTTPリクエストヘッダの情報は %{環境変数名} と指定することで RewriteCond で利用することができます。
なにやら小難しいですが、環境変数はWordPressのget_○○○()関数のように特定のデータを取得する働きがあります。
グループ名 | 環境変数名 |
---|---|
ヘッダ環境変数 |
|
サーバー環境変数 |
|
リクエスト環境変数 |
|
システム日付・時刻変数 |
|
その他 |
|
スマホサイトとPCサイトを自動振り分け
スマホサイトとPCサイトを別々に作っている場合、スマホからのアクセスならスマホサイトに、PCからのアクセスならPCサイトに、といった別々にリダイレクトさせる仕組みが必要になります。
以下は.htaccessで振り分けを行う方法です。
# PC→スマホのリダイレクト
RewriteCond %{REQUEST_URI} !/sp/
RewriteCond %{HTTP_USER_AGENT} (iPod|iPhone|Android)
RewriteRule ^(.*)$ http://www.example.com/sp/$1 [R=301,L]
# スマホ→PCのリダイレクト
RewriteCond %{REQUEST_URI} /sp/
RewriteCond %{HTTP_USER_AGENT} !(iPod|iPhone|Android)
RewriteRule ^sp/(.*)$ http://www.example.com/$1 [R=301,L]
※example.comは任意で変更してください。
今回はiPodとiPhoneとAndroidのみをスマホサイトにリダイレクトさせています。
404ページをリダイレクトさせる
ページが見つからなかった場合の404ページを、カスタマイズした専用ページへリダイレクトさせる設定です。
ErrorDocument 404 /404.php
上記の指定方法はルート直下に404.phpを設置する場合の指定方法です。
同様に403ページ、500ページ、503ページなど他のエラーページの設定もしておきましょう。
.htpasswdの設定
※WEBサーバーによっては正常に動作しない場合があります。
WEBサイトにアクセスする際にパスワード入力画面を表示させ、アクセスを制限するには.htpasswdファイルを設定します。
以下は.htaccessに記述する内容です。
AuthUserFile /home/example/.htpasswd # htpasswdの場所をフルパスで指定します。
AuthGroupFile /dev/null #グループごとでのアクセス制限はしないという意味。
AuthName "Input" # パスワード画面で表示されるテキスト。
AuthType Basic #「Basic(ベーシック認証)」と「Digest(ダイジェスト認証)」の2種類があります。
require valid-user # だれでもアクセスできるという意味。
<Files ~ "^.(htpasswd|htaccess)$"> # .htaccessと.htpasswdを外部のブラウザ上で見せなくする設定。
deny from all
</Files>
.htpasswd内の記述
test:QRzhUerBlG0pk
このように、IDとパスワードの間をコロンで区切ります。
ちなみに上記はID:test、パスワード:testで設定しています。
パスワードは、htpasswdを暗号化させる適当なツールで暗号にしておきましょう。
正常に動かない場合はこちらを参照してください。