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.html や index.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 を編集する。
403 や 500 は Apache 側で処理されるため、ErrorDocument
が有効に機能する。