.htaccessジェネレーター
一般的なサーバー構成のApache .htaccessルールを生成します。
HTTPSを強制
WWW/非WWWを強制
セキュリティヘッダー
GZIP圧縮
ブラウザキャッシング
カスタムエラーページ
ディレクトリオプション
生成された.htaccessファイル
.htaccessとは?
.htaccessファイルは、Apache Webサーバー用の構成ファイルです。メインのサーバー構成を変更せずに、URLリダイレクト、セキュリティヘッダー、キャッシュルールなどを定義できます。
よくある質問
.htaccessファイルをどこに配置すべきですか?
サイトのルートディレクトリ(通常はpublic_htmlまたはwww)に配置します。ルールはこのディレクトリとそのすべてのサブディレクトリに適用されます。
Nginxで動作しますか?
いいえ。.htaccessはApache固有です。Nginxはnginx.confまたはサイト構成ファイルで独自の構成構文を使用します。
.htaccessはサイトを遅くする可能性がありますか?
Apacheはリクエストごとに.htaccessをチェックするため、非常に大きなファイルはオーバーヘッドを追加する可能性があります。トラフィックの多いサイトでは、ルールをメインのApache構成に移動する方が高速です。
.htaccessとは何か
.htaccess ファイルはApacheのディレクトリ単位の設定ファイルだ。この名前は「hypertext access(ハイパーテキストアクセス)」の略と広く理解されており、ハイパーテキスト文書へのアクセス制限というファイル本来の用途を反映している。任意のディレクトリに配置すると、そのディレクトリとすべてのサブディレクトリにディレクティブが適用される。ドットの前に名前はない(Unixのドットファイルで、デフォルトでは非表示)。ファイル名は正確に .htaccess(小文字、先頭のドット)でなければならない。デフォルトの AccessFileName 設定でApacheが検出できる名前はこれだけだ。
実際にパフォーマンスコストがある。Apacheのドキュメントには明記されている:「AllowOverrideが.htaccessファイルの使用を許可するように設定されている場合、Apacheはすべてのディレクトリで.htaccessファイルを探す。そのため、.htaccessファイルを許可するとパフォーマンスに影響が出る。実際に使用するかどうかにかかわらず。」ディレクトリツリーはすべてのHTTPリクエストで走査される。/var/www/html/foo/bar/baz.html へのリクエストでは、Apacheは /.htaccess、次に /var/.htaccess、次に /var/www/.htaccess、次に /var/www/html/.htaccess を順にstatチェックし、これらのファイルが存在しない場合でも続く。Apacheの推奨はメイン設定の <Directory> ブロックを可能な限り使用し(起動時に1回解析される)、メイン設定にアクセスできないホスティング環境のために .htaccess を予約することだ。
必要な場合(と不要な場合)
Apacheは .htaccess の2つの正当なユースケースを挙げている:サーバー設定への完全アクセスなしにユーザーへの限定的な制御を提供するホスティングプロバイダー、およびデプロイヤーがファイルシステムのみを管理するサブディレクトリ間でディレクティブを変える必要がある場合だ。それ以外では、ドキュメントはルールをメイン設定の <Directory> ブロックに移すことを明示的に推奨している。
nginx(2番目に人気のウェブサーバー)は.htaccessをサポートしない;パフォーマンス上の理由からディレクトリ単位の設定ファイルを意図的に拒否しており、すべての設定は nginx.conf および含まれるサイトファイルに記述する。プロジェクトがnginxの場合、このジェネレーターの出力は使えない。nginx設定ファイルのserver・locationブロックが必要だ。CaddyはLet's Encryptによる自動HTTPSをデフォルトとする独自のCaddyfile構文を使用する。LiteSpeedとOpenLiteSpeedはApache互換性のために .htaccess をサポートする。IISは web.config を使用する。
URLの書き換えと標準的なHTTPSパターン
ほとんどの本格的な .htaccess の作業ではmod_rewrite(POSIXの拡張正規表現に基づくApacheのルールベースのURL書き換えエンジン)を使用する。基本的な形は RewriteRule pattern substitution [flags] で、オプションで1つ以上の RewriteCond 条件を前に置く。標準的なHTTPS強制ブロック:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
[L,R=301] フラグは「このラウンドの最後のルール」と「HTTP 301 Moved Permanentlyで応答する」を意味する。301は永続的なリダイレクトに適した選択で、検索エンジンはリンクエクイティを渡し、ブラウザは積極的にキャッシュする。302(Found)はキャッシュされないことが重要な本当に一時的なリダイレクトにのみ使用する。
TLSを終端するロードバランサーやリバースプロキシの背後では、ユーザーのブラウザがHTTPSを使っていてもオリジンサーバーにはプレーンHTTPが見える。単純な RewriteCond %{HTTPS} off ルールは無限リダイレクトを引き起こす。修正方法は転送ヘッダーを代わりにチェックすること: RewriteCond %{HTTP:X-Forwarded-Proto} !https。Cloudflareの「Flexible SSL」モード(CDNはオリジンへHTTPで通信しながらユーザーにはHTTPSを提供)がこのリダイレクトループの最も一般的な原因だ。
同様のパターンでwwwあり・なしの正規化を選択する。SEO(重複コンテンツの問題を回避)とCookieのスコープ(www サブドメインはデフォルトでapexとは異なるCookieを受け取る)のために、1つの正規ホスト名を選ぶ。
圧縮とキャッシュ
mod_deflateはテキスト応答をgzip圧縮し、text/HTML/CSS/JSの転送サイズを大幅に削減する。モジュールが読み込まれていないサーバーでサイトがクラッシュしないよう、ブロックを <IfModule mod_deflate.c> で囲む。Brotli(mod_brotli)は現代の代替で、同じパターンを使用する。
mod_expiresは Expires と Cache-Control: max-age ヘッダーを設定する。よく使われる「access plus 1 year」構文は、ユーザーがフェッチした時点から1年間アセットをキャッシュできることを意味する。長いmax-ageはハッシュ化されたアセットファイル名(app.abc123.js)に適切;短いmax-ageはHTMLと変更可能なものに適切。より細かい制御には、ハッシュ化されたファイルへの Header set Cache-Control "public, max-age=31536000, immutable" が現代のベストプラクティスだ。
知っておくべきセキュリティヘッダー
- X-Frame-Options: SAMEORIGIN:他のオリジンの
<iframe>でページが埋め込まれるのを防ぐ。CSP のframe-ancestorsによってほぼ置き換えられた。 - Content-Security-Policy:XSSとクリックジャッキングに対する現代の主要な防御手段。スターター:
default-src 'self'; img-src 'self' data:; style-src 'self' 'unsafe-inline'; script-src 'self'。時間をかけて厳格にする。 - Strict-Transport-Security(HSTS):ブラウザにドメインに対して常にHTTPSで通信するよう伝える。
max-age=31536000; includeSubDomainsが典型的なベースラインだ。preloadはHTTPSが永続的であることが確実なときのみ追加する。ブラウザのHSTSリストにプリロードされると削除が困難になる。 - X-Content-Type-Options: nosniff:ブラウザが
Content-Typeヘッダーを推測するのを防ぐ。このヘッダーの値は1つだけだ。 - Referrer-Policy: strict-origin-when-cross-origin:現代のデフォルト;同一オリジンのリクエストには完全なURLを送り、クロスオリジンのリクエストにはオリジンのみを送り、HTTPS→HTTPへのダウングレードでは何も送らない。
- Permissions-Policy:カメラ・マイク・位置情報などのブラウザ機能を制御する。古いFeature-Policyヘッダーに取って代わった。
- X-XSS-Protection:ほぼ廃止。このフィルターはChromeから削除されFirefoxにも存在しない;現代のセキュリティはCSPに依存する。多くの古いガイドではレガシーIEのために今も含めているが、新しいサイトでは省略して問題ない。
提供すべきでないものを隠す
セキュリティを強化する2つの一行設定は十分に価値がある:
Options -Indexes:index.htmlがない場合に自動生成されるディレクトリ一覧を無効にする。多くのディストリビューションはデフォルトでディレクトリインデックスを有効にして出荷する;保護されていないディレクトリはウェブにその内容を漏らすべきではない。- ドットファイルとソース管理メタデータをブロックする。
<FilesMatch "^(\.htaccess|\.htpasswd|\.env|\.git.*)$">ブロックにRequire all deniedを指定すると、攻撃者が.env(DBパスワードやAPIキーを含むことが多い)や.git/config(リモートURLや場合によっては認証情報を公開する)をダウンロードするのを防げる。AkamaiとSANSの脅威レポートは、.envの露出を2020年代で最も一般的なアプリケーション層の漏洩の1つとして記録している。
Apache 2.4は古い Order Allow,Deny 構文を、よりクリーンな Require ファミリーのディレクティブ(Require all granted、Require all denied、Require ip 192.0.2.0/24、Require not ip 198.51.100.5)に置き換えた。古い構文は後方互換性のために引き続き動作するが、廃止予定として文書化されている。
よくある落とし穴
- mod_rewriteはサーバーレベルで有効化されている必要がある。Debian/Ubuntuでは:
sudo a2enmod rewrite && sudo systemctl restart apache2。これがないと、すべてのRewriteRuleは黙って無視される。 - AllowOverrideは重要だ。メイン設定に
AllowOverride Noneが設定されている場合(<Directory>ディレクトリ向け)、.htaccessのすべてのディレクティブは黙って無視される。AllowOverride Allはすべてを許可;AllowOverride FileInfo AuthConfigは書き換えと認証のみを許可し、ほとんどのユースケースには十分だ。 - タイポ一つでサイト全体が壊れる。ファイルが修正されるまで、影響を受けるディレクトリツリーへのすべてのリクエストに対してApacheは500 Internal Server Errorを返す。常にステージングで先にテストする;
.htaccess.bakという名前のバックアップを保持する;壊れたファイルをリモートで名前変更できるよう、SSH・FTPアクセスを準備しておく。構文メッセージは/var/log/apache2/error.logを確認する。 - 無限リダイレクトループ。ブラウザはリダイレクトチェーンを約20ホップで上限とし、
ERR_TOO_MANY_REDIRECTSを表示する。最も一般的な原因:TLS終端プロキシ背後のサーバーで実行されるHTTPSリダイレクトルール(%{HTTP:X-Forwarded-Proto}を使用する);順序が間違ったwwwとHTTPSルールによる二重リダイレクト;Cloudflare Flexible SSLモード。 [L]フラグは書き換えたURLでリライトエンジンを先頭から再実行する。後続のルールがマッチすると、動作が意外なことになる。本当にハードストップが必要な場合は、[END](Apache 2.3.9以降)を使用する。- ディレクトリ単位のコンテキストでは先頭のスラッシュが除去される。
.htaccessではRewriteRule ^index\.html$ home.htmlはマッチするが、RewriteRule ^/index\.html$はマッチしない。メイン設定の例からルールをコピーした人は全員が引っかかる。 - .htaccessで禁止されているディレクティブがある:
<VirtualHost>、<Directory>、<Location>、Listen、ServerNameはメイン設定のみだ。ディレクトリ単位のファイルは既に暗黙的に自分のディレクトリに適用される。
よくある質問
ファイルはどこに配置すればよいですか?
管理したい内容のディレクトリに配置する。ほとんどの共有ホスティングユーザーは、ホストによって public_html/、www/、または htdocs/ というサイトのドキュメントルートに配置する。Apacheはそのディレクトリとすべてのサブディレクトリにルールを適用しながらディレクトリツリーを走査する。
301か302か、どのリダイレクトを使うべきですか?
301 Moved Permanently:永続的な移動に使用する。検索エンジンはリンクエクイティを新しいURLに移し、ブラウザはリダイレクトを積極的にキャッシュする。「このページは永久に移動した」という場合に使用する。302 Found:一時的なリダイレクトで、ブラウザはキャッシュせず検索エンジンはランキングを移さない。移動が本当に一時的な場合のみ302を使用する;デフォルトで301の代わりに302を使うのは最もよくあるSEO上の自傷行為のひとつだ。
ディレクトリにパスワード保護をかけるにはどうすればよいですか?
.htpasswd ファイルを htpasswd コマンドラインユーティリティ(username:bcrypt-hash 行を保存する)で作成し、ウェブルートの外に保管する。次に .htaccess に記述する:AuthType Basic、AuthName "Restricted Area"、AuthUserFile /full/path/to/.htpasswd、Require valid-user。ブラウザはディレクトリを訪れた人にシステムのBasic認証プロンプトを表示する。これはApacheの古典的なパターンだ;本格的な認証にはアプリケーションレベルのログインシステムを検討する。
WordPressで使えますか?
WordPressはパーマリンクを処理する独自の .htaccess ブロック(# BEGIN WordPress と # END WordPress マーカーの間)を搭載している。パーマリンク設定を保存するとWordPressはそのマーカー内のものをすべて上書きする。自動再生成を生き残らせるために、自分のルールはWordPressマーカーの外(通常はその上)に追加する。
何かサーバーに送信されますか?
いいえ。ジェネレーターはチェックボックスに基づいてディレクティブブロックを組み立てるJavaScriptだ;出力はブラウザで生成される。ドメインや選択したオプションに関する情報はページから出ない;ツールは読み込み後オフラインで動作する。