.htaccess Generator

Options & ErrorDocument ガイド

ジェネレーター

Options ディレクティブ

Apache がディレクトリに対して提供する機能を ON / OFF する設定。.htaccess に記述することでディレクトリ単位の挙動を制御できる。

構文

Options [+|-]オプション名 [[+|-]オプション名] ...

+ / - をつけると現在の設定を継承して追加・削除できる。つけない場合は指定したオプションに完全に置き換わる。

主要なオプション一覧

オプション 意味 よくある用途
Indexes index ファイルがないときにディレクトリ一覧を表示する -Indexes で一覧を非表示にしてファイルの直接閲覧を防ぐ
FollowSymLinks シンボリックリンクをたどることを許可する WordPress の mod_rewrite に必要。通常は有効にする
SymLinksIfOwnerMatch シンボリックリンク先のオーナーが一致する場合のみたどれる FollowSymLinks よりセキュアだが処理が重い
MultiViews 拡張子なしでアクセスされたとき、最適なファイルを自動選択する コンテンツネゴシエーション(言語・形式の自動振り分け)
ExecCGI CGI スクリプトの実行を許可する CGI を使うディレクトリでのみ有効にする
All MultiViews 以外の全オプションを有効にする サーバーのデフォルト値として使われることが多い
None すべてのオプションを無効にする 制限の強いディレクトリに使用

継承と + / - 記法

Options は親ディレクトリから子ディレクトリへ継承される。+ / - なしで指定すると継承をリセットして完全に上書きする。

# 悪い例:上位の設定をリセットして Indexes だけを有効にしてしまう
# FollowSymLinks など他のオプションも消えるため mod_rewrite が動作しなくなる
Options Indexes

# 良い例:現在の設定を維持したまま Indexes だけ無効にする
Options -Indexes

注意: 記号なしの Options Indexes のような書き方は、その行で指定したものだけにオプションをリセットしてしまう。一方、Options -Indexes のように + / - を付けた指定は「現在の設定」を基準に相対的に変更する動作になることを理解して使うこと。

WordPress での使い方

WordPress が動作するには mod_rewrite モジュールが必要で、FollowSymLinks(または SymLinksIfOwnerMatch)が有効になっていることが前提となる。

# WordPress の .htaccess での典型的な記述
Options -Indexes +FollowSymLinks

多くのレンタルサーバーではデフォルトで FollowSymLinks が有効になっているが、明示的に記述しておくと環境依存によるトラブルを防げる。

注意: 一部のレンタルサーバー環境では、.htaccess から Options を変更すること自体が禁止されており、Options 行を記述すると 500 エラー(Internal Server Error)になる場合がある。そのような環境では、Options 行をコメントアウトまたは削除して運用すること。設定を追加した直後に 500 エラーになった場合は、まず Options 行を一時的に外して動作を確認すること。

ディレクトリ一覧の無効化

index.htmlindex.php が存在しないディレクトリにアクセスされると、デフォルトでファイルの一覧が表示されてしまう。これを防ぐには -Indexes を使う。

<IfModule mod_autoindex.c>
    Options -Indexes
</IfModule>

ディレクトリ一覧の公開はファイル構成の露出や攻撃者による探索(列挙)のリスクになる。本番環境では必ず無効にすること。


ErrorDocument ディレクティブ

HTTP エラーが発生したときに返すレスポンスをカスタマイズする設定。デフォルトの素っ気ないエラーページをカスタムページに差し替えたり、別の URL にリダイレクトしたりできる。

構文

ErrorDocument ステータスコード レスポンス

レスポンスとして指定できるのは以下の3種類:

種類 記述例 動作
ローカルパス /error/404.html サーバー内のファイルを内部転送(URLは変わらない)
外部URL https://example.com/404 外部URLへ302リダイレクト
テキスト "Not Found" 指定した文字列をそのまま返す(引用符必須)

ローカルパスは ルートからの絶対パス/ 始まり)で指定するのが基本。相対パスも指定自体は可能だが、エラー発生場所によって解決先が変わりやすく推奨されない

主なエラーコードと用途

コード 意味 カスタマイズの目的
400 Bad Request 不正なリクエスト(URLに制御文字など)のエラーページ
401 Unauthorized Basic 認証失敗時のカスタムメッセージ
403 Forbidden アクセス拒否ページ(deny from all 等の後に表示される)
404 Not Found 存在しないページへのアクセス。最もよく使われる
500 Internal Server Error PHP エラーや設定ミスで発生するサーバー内部エラー
503 Service Unavailable メンテナンス中など、一時的なサービス停止時のページ

カスタムエラーページの設定例

# よく使う3つのカスタムエラーページを設定する例
ErrorDocument 403 /error/403.html
ErrorDocument 404 /error/404.html
ErrorDocument 500 /error/500.html

エラーページのファイルは通常の HTML ファイル。CSS や画像を参照するときは ルートからの絶対パス で指定する(エラーページは任意の URL でアクセスされるため、相対パスは正しく解決されないことがある)。

メンテナンスページの実装

サイト全体をメンテナンス中にするには、RewriteRule で 503 ステータスを返し、ErrorDocument 503 でメンテナンスページを返す。

<IfModule mod_rewrite.c>
    RewriteEngine On
    # メンテナンスページ自身はリダイレクトしない
    RewriteCond %{REQUEST_URI} !/maintenance.html$
    # 画像・CSS・JS は除外する
    RewriteCond %{REQUEST_URI} !\.(css|js|png|jpg|gif|ico|svg)$ [NC]
    RewriteRule ^(.*)$ - [R=503,L]
</IfModule>

# 503 ステータスを返す(SEOクローラーに一時的な停止と伝える)
ErrorDocument 503 /maintenance.html

メンテナンス中は 503 を返すことで、検索エンジンのクローラーに「一時停止中」と伝えられる。リダイレクト(R=302)では最終応答が 200 OK になってしまい SEO に悪影響を与える。代わりに R=503,L で直接 503 ステータスを返し、ErrorDocument で対応するページを指定する。必要に応じて Retry-After ヘッダーで再試行時期を指示することも推奨される。

WordPress での注意点

WordPress 環境では、404 は WordPress 本体が処理するため ErrorDocument 404 の設定は通常効かない。WordPress のリライトルールにより、存在しないパスでも index.php に転送されて WordPress 側で 404 テンプレートが返される仕組みになっている。

# WordPress の .htaccess(WP が自動生成する部分)
# RewriteRule ^(.*)$ index.php [L]
# ↑ 全リクエストを index.php に渡すため Apache の ErrorDocument 404 は使われない

WordPress の 404 ページをカスタマイズしたい場合は、テーマの 404.php を編集する。

403500 は Apache 側で処理されるため、ErrorDocument が有効に機能する。

← ジェネレーターに戻る