.htaccess ファイル(分散設定ファイル)は、サーバの挙動を決定する設定ファイルのひとつ。
ウェブサーバとして「Apache」が使用されていて、サーバ管理者が「.htaccess」ファイルの設置を許可していれば使用可能。

通常 Apache は、httpd.conf というテキストファイルにディレクティブ(命令、コマンドのこと)と呼ばれる専用の命令を記述することで設定するが、httpd.conf はサーバ管理者しか編集できない。それに対して、.htaccess ファイルは各ユーザが、各ディレクトリ単位で設定することができるため、一般的によく利用される。

※.htaccess、または、httpd.conf へ設定を追記することで実現する。
またhttpd.confが親の設定ファイルで、.htaccessはhttpd.confの設定を上書きする形で反映される。
httpd.confが使用できる場合はこちらを利用する場合もあり、設定方法は.htaccessとほぼ同じである。

.htaccessとhttpd.confは何が違う?

ApacheなどWebサーバーの動作を変更するには、設定をサーバーに伝えなければいけない。
その手段として、主に次の2つがある。

  • 根本の設定ファイル「httpd.conf」などで指定する
  • ディレクトリごとの設定ファイル「.htaccess」で指定する

.htaccesshttpd.confには、次のような違いがある。

  • httpd.conf」などの設定ファイルはサーバー管理者しか変更できないが、「.htaccess」はコンテンツ管理者が変更できる
  • httpd.conf」はサーバーの起動時に1回読み込まれるだけだが、「.htaccess」はアクセスごとにファイルが読み込まれる

httpd.conf」で指定したサーバーの設定を、ディレクトリごとに変更するための仕組みが「.htaccess」である。ただ、.htaccessはサーバー管理者以外でも内容を変更できるため、サイトのルートディレクトリに置いてサイト全体の挙動を変更するという使用方法も多く取られる。

.htaccessに設定を記述すると処理が遅くなる

.htaccess ファイルを設置すると、アクセス制限やユーザー認証、リダイレクト(自動転送)、404エラーページのカスタマイズなどを設定することができる。

.htaccess ファイルは単なるテキストファイルだが、以下の点に注意が必要。

  • .htaccess ファイルは設置されたディレクトリとその配下にある全てのディレクトリに影響を与える。
    ルート(public_html)に.htaccess ファイルを設置した場合は、全てのフォルダに影響を与える。
  • 必ず最後に改行(空白行)を入れる。(一行以上の空白も大丈夫)。
  • テキスト形式(プレーンテキスト)で保存する。UTF-8 として保存する場合は、BOMは付加しない。
  • コメントは、行頭に「#」をつける。行の途中よりコメントアウトする場合はダブルクォートで囲む。
  • .htaccess ファイルに文法誤りがある場合、そのディレクトリ以下のファイルにアクセスしようとすると、500 Internal Server Error が発生する。
  • サーバ管理者が許可していない命令(ディレクティブ)を使うと、文法誤りのときと同様に 500 Internal Server Error が発生する。

リダイレクトの設定

リダイレクトとは、ドメインやページの URL (ファイル名やディレクトリ名)が変更された場合に用いられる自動転送処理のこと。

.htaccess ファイルを使ってリダイレクト(自動転送)するには、Redirect ディレクティブを使う方法と RewriteRule ディレクティブを使う方法がある。

Redirect ディレクティブ

以下は、Redirect ディレクティブを使って自動転送する構文。

Redirect [status] URL-path URL
URL-patd転送元の URL を指定する。
転送元の URL は、/ で始まるルートパス(トップディレクトリからのパス)で指定する。
URL転送先の URL を指定する。
転送先の URL は、http: などのスキームで始まる絶対 URL を指定する。
[status] オプション(以下参照)を指定することで、HTTP ステータスコードを返す。
status が指定されていないリダイレクトは、デフォルトの “temp” (HTTPステータス 302) になる。
HTTPステータス status 説明
ステータス301

permanent

恒久的に移転

ステータス302

temp

一時的に移転する

ステータス303

seeother

他のもので置き換えられた

ステータス410

gone

永久に削除された

301リダイレクト

301リダイレクトとは、サイトやページを恒久的に移転先へ転送することで、ユーザーや検索エンジンが正しいページにたどり着くことができるようにする方法。301リダイレクトが使われるケースは以下のような場合。

  • サイトを新しいドメインに移動し、できるだけスムーズに移行を行いたい場合。
  • ユーザーが複数の異なる URL を介してサイトにアクセスする場合。
  • 2 つのウェブサイトを結合し、無効になった URL へのリンクが正しいページにリダイレクトされるようにしたい場合

Redirect ディレクティブを使った転送の場合、status 引数に permanent を指定することで、301リダイレクトになる。

例えば、現在のウェブサイトへの全アクセスを、新しいサイト http://example.com/ へ自動転送させたい場合は以下のように記述する。この場合、転送元(URL-path)が「/」で転送先(URL)が「http://example.com/」である。

Redirect permanent / http://example.com/

RedirectMatchディレクティブ

RedirectMatch ディレクティブは、Redirect ディレクティブと機能はほぼ同じだが、正規表現を用いたマッチングを行う点が異なる。

RedirectMatch [status] regex URL

例えば、すべての GIF ファイルを別サーバの同様な名前の JPEG ファイルに後方参照 を利用してリダイレクトするには、以下のように記述する。

RedirectMatch (.*).gif$ http://www.anotherserver.com$1.jpg
後方参照

RewriteCond の条件パターン(正規表現)で括弧を使って一致した値は、変数を使って再利用できる。RewriteCond で指定したパターンを参照する場合は「%n」を使う(n は1~9の数字)。括弧が複数ある場合は左から %1、%2 というように指定する。

.htaccess が使えない場合

使っている環境で .htaccess によるリダイレクトが使用できない場合には、以下のような方法もある。

meta refresh

meta 要素の http-equiv 属性に “refresh” を設定することにより、リダイレクト(転送)を指定することができる。content 属性で指定した秒数後に、指定した URL へリダイレクトする。

以下が書式。これをhead内に記述する。

<meta http-equiv="refresh" content="秒数; URL=http://移転先ドメイン/"> 

<!-- 以下の例では meta 要素の content 属性で指定する秒数を0秒に指定してある -->
<meta http-equiv="refresh" content="0; URL=http://example.com/">

PHP header() 関数

PHP を使って別のページへリダイレクトさせるには、header() 関数で Location ヘッダーを使用する。

注意点として、header() 関数以下のスクリプトが実行されないように、必ず exit() 関数を使ってスクリプトを終了するようにすること。

<?php
header('HTTP/1.1 301 Moved Permanently');
header('Location: http://example.com/');
exit();
?>
<?php
header('Location: http://example.com/', true, 301);
exit();
?>

mod_rewrite を使ったリダイレクト

サーバーの拡張機能 mod_rewrite の機能が使えれば、RewriteRule ディレクティブ を使ったリダイレクトを設定することができる。

httpd.confに記載する場合

mod_rewrite を使ったリダイレクトの基本的な形は以下のようなものになる。

RewriteEngine On
RewriteBase /
RewriteRule 転送元ファイル正規表現 転送先URL [フラグ] 
  • RewriteEngine:mod_rewrite の機能の On/Off を指定する。デフォルトの値は Off になっているので、URL の書き換え処理を行うには、On にする必要がある。
  • RewriteBase:RewriteRule ディレクティブで指定するリダイレクト先の URL 書き換えの基準となるディレクトリを相対パスで指定する。RewriteRule の転送先を相対パスで記述した場合にのみ適用される。絶対パスで指定している場合は不要。
    省略した場合には実際の URL の階層(.htaccess が置かれたディレクトリからの相対パス)が適用される。
    「RewriteBase /」と記述した場合、どのディレクトリに設置を行った場合でも必ずドキュメントルートからのパスになる。
  • RewriteRule:具体的な URL 書き換えのルールを記述する。1番目のパラメータである正規表現にマッチした場合、2番目のパラメータである URL に書き換えられる。(RewriteRule ディレクティブ )
  • フラグ:省略可能だが、301リダイレクトにするには R=301 を指定する必要がある。また、併せてよく指定される「L」は URL の書き換え処理を終了(last)を意味する。
RewriteEnginemod_rewrite の機能の On/Off を指定する。デフォルトの値は Off になっているので、URL の書き換え処理を行うには、On にする必要がある。
RewriteBaseRewriteRule ディレクティブで指定するリダイレクト先の URL 書き換えの基準となるディレクトリを相対パスで指定する。RewriteRule の転送先を相対パスで記述した場合にのみ適用される。絶対パスで指定している場合は不要。 省略した場合には実際の URL の階層(.htaccess が置かれたディレクトリからの相対パス)が適用される。
「RewriteBase /」と記述した場合、どのディレクトリに設置を行った場合でも必ずドキュメントルートからのパスになる。
RewriteRule具体的な URL 書き換えのルールを記述する。1番目のパラメータである正規表現にマッチした場合、2番目のパラメータである URL に書き換えられる。(RewriteRule ディレクティブ )
フラグ省略可能だが、301リダイレクトにするには R=301 を指定する必要がある。また、併せてよく指定される「L」は URL の書き換え処理を終了(last)を意味する。

以下は、特定のページから特定のページにリダイレクトさせる場合の例。

RewriteEngine On
RewriteRule ^fuga.html$ http://www.example.com/hoge.html [R=301,L]

以下は、ディレクトリ単位でリダイレクトさせる場合で、転送先にファイル名を引き継ぎ、後方参照を使って同じファイル名として別ディレクトリに転送したい場合の例。

RewriteEngine On
RewriteRule ^fuga/(.*)$ http://www.example.com/hoge/$1 [R=301,L]

以下は、ディレクトリ単位でリダイレクトさせる場合で、転送先にファイル名を引き継がず、同一の URL に転送したい場合の例。

RewriteEngine On
RewriteRule ^fuga/(.*)$ http://www.example.com [R=301,L]

RewriteCond ディレクティブ

RewriteCond ディレクティブは、RewriteRule (書き換えルール)を実行するための条件を定義する。RewriteCond に記述した条件を満たした場合のみ、直後の RewriteRule ディレクティブの書き換えが行われ、条件を満たさない場合は、直後の RewriteRule ディレクティブは実行されない。

RewriteCond ディレクティブは、RewriteRule ディレクティブの前に 1 つ以上設置することができ、複数設置する場合は、オプション(フラグ)によって OR 条件として処理するかを指定することができる。オプションを省略した場合は、AND 条件として処理される。

以下が基本的な書式。

RewriteEngine On
RewriteCond テスト文字列 条件パターン [フラグ]
RewriteRule 条件 置換文字列
オプション(フラグ)

RewriteCond で使用できるオプション(フラグ)は以下。

[OR]連続する RewriteCond のいずれかが true の場合に実行する。省略時は、AND 条件として処理され、連続する RewriteCond がすべて true の場合に実行する。
[NC]条件を評価する時、大文字小文字を区別しない。これを指定しないと大文字小文字を区別する。

OR と NC をどちらも指定したい場合には [OR,NC] とカンマ区切りで指定する。

条件を複数指定する場合 (AND 条件): 複数の条件が全て一致した場合に RewriteRule を実行

RewriteCond テスト文字列 条件パターン
RewriteCond テスト文字列 条件パターン
RewriteRule 条件 置換文字列

条件を複数指定する場合 (OR 条件):複数の条件のいずれかが一致した場合に RewriteRule を実行

RewriteCond テスト文字列 条件パターン [OR]
RewriteCond テスト文字列 条件パターン
RewriteRule 条件 置換文字列
テスト文字列に利用できる環境変数

以下は、「www なし」でアクセスがあったら、「www あり」に 301 リダイレクトさせる例。テスト文字列に %{HTTP_HOST} とあるが、これは「サーバーのホスト名」を表す。mod_rewrite では「環境変数」という変数を利用でき、%{環境変数名} と指定することで利用することができる。

RewriteEngine On
RewriteCond %{HTTP_HOST} ^example¥.com$  [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]

以下は利用できる「環境変数」の一例。

HTTP_HOSTリクエスト先のホスト名 (DNS 名) 情報
HTTP_REFERER参照元の URL 情報(前にいたページのURL情報)
HTTP_ACCEPTブラウザがサポートするメディア・MIMEタイプ情報
HTTP_USER_AGENTユーザのブラウザや端末情報
HTTPSHTTPS であれば on、そうでなければ off を返す
QUERY_STRINGクエリ文字列
SERVER_ADDRサーバーのアドレス
SERVER_PORTサーバーのポート番号
PAtd_INFOファイル名とクエリ文字列の間にあるパス情報
REMOTE_ADDRユーザの IP アドレス情報
REMOTE_USERリモートユーザー名 (Basic 認証利用時)
REMOTE_HOSTリモートホスト名(ユーザーのホスト名)
tdE_REQUESTリクエスト文字列(ユーザーのブラウザから送られてきた HTTP リクエスト行:例 GET /index.html HTTP/1.1)
REQUEST_URIリクエストされた URI 情報
REQUEST_FILENAMEリクエストされたファイル名(ファイルシステム内の絶対パス)
SCRIPT_FILENAME実行するスクリプトの絶対パス情報
DOCUMENT_ROOTドキュメントルートのパス
TIME_YEAR
TIME_MON
TIME_DAY
TIME_WDAY曜日 (0:日 ~ 6:土)
ENV:環境変数名%{ENV:…} 式を指定して環境変数に基いて条件分岐を行なうことができる
条件パターンで使える演算子

RewriteCond では条件に一致するパターンを Perl 互換の正規表現で指定する。以下は条件パターンの例。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

1行目は、%{REQUEST_FILENAME} (リクエストされたファイル名)が「!-f」という条件を満たしていれば true となる。「!-f」は「!」と「-f」に分割することができる。

「-f」はファイルが存在する場合(ファイルである場合)は true を返す。「!」は否定(結果を逆転させるもの)。よって、「!-f」はファイル以外の(ファイルが存在しない)場合は、true を、ファイルの場合は false を返す。

2行目は、「-d」がディレクトリかどうかの検証を行い、%{REQUEST_FILENAME} がディレクトリの場合(そのディレクトリが存在する場合)は true を、それ以外の場合は false を返すが、1行目と同様に「!」がついているので、ディレクトリ以外の(ディレクトリが存在しない)場合に、true を、ディレクトリの場合は false を返す。

これら2つの条件にはオプション[OR]を指定していないので、AND 条件として処理され、「リクエストされたファイルが存在せず」かつ「リクエストされたディレクトリが存在しない」という条件になる。

以下は利用できる演算子の一例。

!否定
<テスト文字列より大きい場合は true
>テスト文字列より小さい場合は true
=テスト文字列と等しい場合は true
<=テスト文字列以上の場合は true
>=テスト文字列以下の場合は true
-dディレクトリが存在する場合は true
-fファイルが存在する場合は true
-sファイルが存在し、サイズが0でない場合は true

RewriteRule ディレクティブ

RewriteRule ディレクティブは、URL の書き換えを行うディレクティブ。「条件パターン」に一致する URL を、その後の「置換文字列」で書き換える。

条件パターンは(Perl 互換の)正規表現で指定することができる。以下が書式。

RewriteRule 条件パターン 置換文字列 [フラグ]

ユーザーからリクエストのあった URL(サーバーから渡された URL)が、条件パターンにマッチした場合、置換文字列で書き換えられる。

条件パターンURL とマッチさせる部分。正規表現を利用することができる。
置換文字列URLと条件パターンがマッチした場合に、行う処理を指定する部分。
[フラグ]挙動を制御するためのオプションを指定できる。複数のフラグを指定する場合は、カンマ区切りで指定する。

以下は「/index.html」でアクセスがあった場合、「/」に 301 リダイレクトさせる例。

RewriteEngine On
RewriteRule ^index\.html$ http://example.com/ [R=301,L]

以下は、RewriteRule で利用可能なフラグの例。

フラグ 別名 意味
R[=code]

redirect

指定した URL にリダイレクトする。
[R=301] のようにレスポンスコードを指定することができる。
指定しない場合は 302(Moved Temporarily) でリダイレクトされる。temp(デフォルト値:302)、permanent(301)、seeother(303) のシンボル名も指定できる。

F

forbidden

ステータスコード「403」(Forbidden)を返す。RewtiteCond に設定した条件で、Webサーバへのアクセスを禁止する場合などに指定する。

G

gone

ステータスコード「410」(Gone)を返す。ユーザーに、存在しないページにアクセスしていることを通知する場合に指定する。

P

proxy

ルールにマッチしている場合は、書き換えたURLをプロキシ要求とみなし、リバースプロキシとして動作する。このフラグを使用する場合は、mod_proxy が組み込まれている必要がある。

L

last

ルールにマッチしている場合は、URLの書き換え処理を終了する。後続のルールは適用されない。ただし、 .htaccess では「L」フラグが有効にならない。

N

next

一連の書き換え処理のルールを先頭のルールから再度実行する。すでに書き換えられたURLが対象となる。本フラグを指定する場合は、書き換え処理が無限に実行されないように、適切に終了条件を設定する必要がある。

C

chain

ルールにマッチしている場合は、後続のルールを適用する。ルールにマッチしていない場合、後続のルールはすべて適用されない。

T=MIME-type

type=MIME-type

ルールにマッチしている場合は、指定した MIME タイプを Content-Type ヘッダに設定する。

NS

nosubreq

Webサーバ内で発生するサブリクエストには、ルールを適用しない。ユーザーから末尾がスラッシュ(/)のURLが指定された際に、DirectoryIndex ディレクティブで指定したファイルに対するサブリクエストが発生するが、そのサブリクエストはルールを適用しない場合などに使用する。

NC

nocase

大文字小文字を区別せずにルールを適用する。

QSA

qsappend

書き換え前のURLおよび置換文字列にそれぞれクエリ文字列(URL内のクエスチョンマーク(?)以降の文字列)が存在する場合、置換文字列の末尾にアンパサンド(&)と書き換え前の URL に指定されたクエリ文字列を追加する。本フラグを指定しない場合、クエリ文字列は置換文字列で上書きされる。

NE

noescape

書き換え時のURLエスケープを抑制する。通常、パーセント(%)やセミコロン(;)などの特殊文字は、16進表現の“%25”、“%3b”にエスケープされるが、本フラグを指定した場合は、エスケープされない。

PT

passthrough

URLの書き換え後、他のモジュールに制御を渡す。書き換えたURLに対して、Aliasディレクティブ、ScriptAliasディレクティブ、およびRedirectディレクティブなどを使用する場合に指定する。

S=num

skip=num

ルールにマッチしている場合、数値に指定した数の後続のルールの適用をスキップする。

E=環境変数:値

env=環境変数:値

ルールにマッチしている場合、指定した任意の環境変数に値を設定する。値には、置換文字列と同様に、$n および %n も指定する。

index.html なしに統一

/index.html(インデックスファイル)にアクセスがあったら、/(ディレクトリ)に301リダイレクトさせる方法。

例えば、https://www.example.com/index.html にアクセスがあった場合、https://www.example.com/ にリダイレクト(URL を正規化)するには、以下のように記述する。

RewriteEngine On
RewriteCond %{THE_REQUEST} ^.*/index\.html
RewriteRule ^(.*)/index\.html$ https://%{HTTP_HOST}/$1 [R=301,L]

index.html だけではなく、index.php も対象とするには、以下のように記述する。

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

www あり・なしの統一

www ありの URL を、www なしの URL にリダイレクト、または、その逆の処理を行う。

www なしに統一

www.exmaple.com でアクセスがあった場合に exmaple.com にリダイレクト(URL を正規化)する方法。ドメイン部分を自分の環境に書き換えて、以下を記述した .htaccess をルートディレクトリに設置する。

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

http://www.example.com/~ でアクセスがあった場合、%{HTTP_HOST} は www.example.com になる。RewriteCond 条件パターン部分の ^www\.example\.com とマッチするので、処理は RewriteRule に移行してリダイレクトされる。 [NC] は大文字小文字を区別しないフラグ。

$1 はリクエストされたページの URL を後方参照  で、正規化済みの URL の末尾に加えている。また、R=301 を指定して 301リダイレクトにしている。L は書き換えの終了(Last)を意味する。

www ありに統一

前述とは逆に exmaple.com でアクセスがあった場合に www.exmaple.com にリダイレクト(URL を正規化)する方法。ドメイン部分を自分の環境に書き換えて、以下を記述した .htaccess をルートディレクトリに設置する。

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

https スキームに統一

http からはじまる URL へのアクセスを https へリダイレクトさせる例。

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

%{HTTPS} は HTTPS であれば on、そうでなければ off を返す。off の場合、https で始まる URL にリダイレクトさせる。

%{HTTP_HOST} はホスト名、%{REQUEST_URI} はクエリ文字列を含む URI 情報。http://example.com/fuga/index.html にアクセスされた場合、%{HTTP_HOST} は example.com、%{REQUEST_URI} は/fuga/index.html になる。

拡張子なしでのアクセス

通常 URL にはファイルの拡張子が含まれますが、拡張子なしでもアクセスできるようにする方法。

http://exmaple.com/sample.html でも、
http://exmaple.com/sample でも同じファイルにアクセスできるようにする例。

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html 

%{REQUEST_FILENAME} !-d は、リクエストされたファイル名のディレクトリが存在しない場合は、という条件。

%{REQUEST_FILENAME}\.html -f は、リクエストされたファイル名に .html が付いたファイルが存在する場合は、という条件。

これら2つの条件にはオプション[OR]を指定していないので、AND 条件として処理されて、書き換え処理が行われ、結果として拡張子なしでアクセスしても拡張子の付いたファイルが表示される。

メンテナンスページにリダイレクト

どの URL にアクセスしても「現在メインテナンス中です」というメインテナンスページを表示する方法。まず、

メインテナンスページ(例:maintenance.html 任意の名前)を用意して、.htaccess に以下のように記述する。以下の例では、メインテナンスページはドキュメントルートに配置。(/maintenance.html)

ErrorDocument 503 /maintenance.html
     
RewriteEngine On
RewriteCond %{REQUEST_URI} !=/maintenance.html
RewriteCond %{REMOTE_ADDR} !=xxx.xxx.xxx.xxx
RewriteCond %{REQUEST_FILENAME} !\.(css|jpe?g|gif|png|js)$
RewriteRule ^.*$ - [R=503,L]
 
Header set Retry-After "Sun, 06 Aug 2017 6:00:00 GMT"
ErrorDocument 503 /maintenance.html
RewriteCond %{REQUEST_URI} !=/maintenance.html
RewriteCond %{REMOTE_ADDR} !=xxx.xxx.xxx.xxx
RewriteCond %{REQUEST_FILENAME} !.(css|jpe?g|gif|png|js)$
RewriteRule ^.*$ – [R=503,L]
Header set Retry-After “Sun, 06 Aug 2017 6:00:00 GMT”

メンテナンスを知らせるページを作っている時間がない(緊急にメンテナンスをおこなければならない)場合は、以下を .htaccess に追記すれば、ユーザーには「Sorry. We’re under maintenance.」というメッセージを表示し、検索エンジンには503を返すことができる。

ErrorDocument 503 "Sorry. We're under maintenance."
RedirectMatch 503 .*

RewriteとRedirectの違い

Rewriteは、Rオプションをつけない場合、リクエストURLを書き換えない。 RedirectはリクエストURLを常に書き換え、元URLはわからなくなる。

Redirect 301 /main/ http://www.abc.com/index.html
Redirect permanent /main/ http://www.abc.com/index.html

エラーページの変更

ErrorDocument ディレクティブを使って、エラードキュメントの表示方法の設定をすることができる。(Apache コア機能 ErrorDocument ディレクティブ

以下が書式。error-code にはステータスコード  を、document には、表示するテキストまたはファイルへのパスを指定する。

ErrorDocument error-code document

ErrorDocument ディレクティブを使って、問題やエラーが発生したときに、 以下の四つのうちのいずれかの動作を設定することができる。

  1. Apache 標準の簡単なエラーメッセージを表示(デフォルトなので特に設定は不要)
  2. 自分で指定したメッセージを表示
  3. 問題やエラーの処理をする為に、自サーバ内の URL-path へリダイレクト
  4. 問題やエラーの処理をする為に、外部の URL へリダイレクト

自分で指定したメッセージを表示

自分で指定したメッセージを表示を表示する場合は、エラーコードの後に、メッセージをダブルクォート(”)で囲んで記述する。

ErrorDocument 404 "Sorry, the file not found"

問題やエラーの処理をする為に、自サーバ内の URL-path へリダイレクト

自分のサーバーに表示するファイルを配置する場合は、/ で始まるドキュメントルートからの相対パスを指定する。以下は 404.html というファイルをルートディレクトリに配置した場合の例。

401(Unauthorized:認証失敗)や 404(Not Found:未検出)の際にファイルを指定する場合はこの方法を使用する。

ErrorDocument 404 /404.html

問題やエラーの処理をする為に、外部の URL へリダイレクト

http などで始まる完全な URL を指定する。この場合、クライアントはエラーステータスコードを受け取らずに、リダイレクトのステータスコードを受け取るので注意が必要。

ErrorDocument 500 http://foo.example.com/cgi-bin/tester

リモートURLを指定する際の注意点

リモート(外部) URL を ErrorDocument に指定すると、 たとえ文書が同じサーバにあっても、ドキュメントがどこにあるかを通知するために、 Apache はリダイレクトをクライアントに送出する(クライアントはエラーステータスコードを受け取らずに、リダイレクトのステータスコードを受け取る)。

このため、ステータスコードを使って URL が有効であるかどうかを決定しようとする ウェブロボットやその他クライアントを混乱させる可能性があるので注意が必要。

また、ErrorDocument 401 にリモートの URL を指定すると、 クライアントは 401 というステータスコードを受け取らないため、 パスワードをユーザーに入力要求しなければならないことがわからない。 そのため、ErrorDocument 401 というディレクティブを使う場合は、 内部サーバーの文書を参照する必要がある。

同様に ErrorDocument 404 の場合も、内部サーバーの文書を参照するようにして、必ずウェブサーバーからユーザーやクローラーに 404 ステータスコードを返して、検索エンジンがカスタム 404 ページを誤ってインデックスに登録しないようにする必要がある。

404 ページを作成する場合に考慮する点

有益な 404 ページを作成する」には、以下のようなことも書かれている。

  • ユーザーに対して、探しているページが見つからないことを明確に伝える。
  • 404 ページを、サイトのその他の部分と同じデザイン(ナビゲーションを含む)にする。
  • 最も人気のある記事や投稿へのリンクの他、ホームページへのリンクを追加する。
  • 404 ページが Google や他の検索エンジンのインデックスに登録されないようにするため、存在しないページがリクエストされたときにウェブサーバーが実際の 404 HTTP ステータス コードを返すことを確認する。
ファイル内のパスは「ルートパス」または「絶対パス」を使用

「404 ページ」は様々な場所から参照・呼び出しされるので画像やファイル、リンクへのパスは「/」から始まるルートパス(トップディレクトリからのパス)または絶対パス(URL)で指定する必要がある。

以下のような画像や CSS ファイル等は「ルートパス」または「絶対パス(URL)」で指定する。

  • 画像へのパス
  • 表示するリンクのパス(ナビゲーションやトップページへのリンク等)
  • CSS や JavaScript のパス
  • 場合によっては CSS や JavaScript は head 内などに記述することも考えられる

noindexの設定

ルートディレクトリ直下の.htaccessファイルで X-Robots-Tag HTTPヘッダー を使用する。
もし特定のディレクトリ以下のPDFファイルのみnoindexを指定したい場合(例えば「https://example.com/document/」以下のみ)は、任意のディレクトリ直下で .htaccessファイルを作成する。

<FilesMatch "\.pdf$">
Header set X-Robots-Tag "noindex"
</FilesMatch>

ちなみに他のファイル(例えばpngファイル)にnoindexを指定したい場合は以下の通り。

<FilesMatch "\.png$">
Header set X-Robots-Tag "noindex"
</FilesMatch>

また、複数のファイルタイプ(例えばpdfとpng)にnoindexを指定したい場合は以下のようにする。

<FilesMatch "\.(pdf|png)$">
Header set X-Robots-Tag "noindex"
</FilesMatch>