.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構文を使用する。LiteSpeedOpenLiteSpeedはApache互換性のために .htaccess をサポートする。IISweb.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_expiresExpiresCache-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" が現代のベストプラクティスだ。

知っておくべきセキュリティヘッダー

提供すべきでないものを隠す

セキュリティを強化する2つの一行設定は十分に価値がある:

Apache 2.4は古い Order Allow,Deny 構文を、よりクリーンな Require ファミリーのディレクティブ(Require all grantedRequire all deniedRequire ip 192.0.2.0/24Require not ip 198.51.100.5)に置き換えた。古い構文は後方互換性のために引き続き動作するが、廃止予定として文書化されている。

よくある落とし穴

よくある質問

ファイルはどこに配置すればよいですか?

管理したい内容のディレクトリに配置する。ほとんどの共有ホスティングユーザーは、ホストによって public_html/www/、または htdocs/ というサイトのドキュメントルートに配置する。Apacheはそのディレクトリとすべてのサブディレクトリにルールを適用しながらディレクトリツリーを走査する。

301か302か、どのリダイレクトを使うべきですか?

301 Moved Permanently:永続的な移動に使用する。検索エンジンはリンクエクイティを新しいURLに移し、ブラウザはリダイレクトを積極的にキャッシュする。「このページは永久に移動した」という場合に使用する。302 Found:一時的なリダイレクトで、ブラウザはキャッシュせず検索エンジンはランキングを移さない。移動が本当に一時的な場合のみ302を使用する;デフォルトで301の代わりに302を使うのは最もよくあるSEO上の自傷行為のひとつだ。

ディレクトリにパスワード保護をかけるにはどうすればよいですか?

.htpasswd ファイルを htpasswd コマンドラインユーティリティ(username:bcrypt-hash 行を保存する)で作成し、ウェブルートのに保管する。次に .htaccess に記述する:AuthType BasicAuthName "Restricted Area"AuthUserFile /full/path/to/.htpasswdRequire valid-user。ブラウザはディレクトリを訪れた人にシステムのBasic認証プロンプトを表示する。これはApacheの古典的なパターンだ;本格的な認証にはアプリケーションレベルのログインシステムを検討する。

WordPressで使えますか?

WordPressはパーマリンクを処理する独自の .htaccess ブロック(# BEGIN WordPress# END WordPress マーカーの間)を搭載している。パーマリンク設定を保存するとWordPressはそのマーカー内のものをすべて上書きする。自動再生成を生き残らせるために、自分のルールはWordPressマーカーの(通常はその上)に追加する。

何かサーバーに送信されますか?

いいえ。ジェネレーターはチェックボックスに基づいてディレクティブブロックを組み立てるJavaScriptだ;出力はブラウザで生成される。ドメインや選択したオプションに関する情報はページから出ない;ツールは読み込み後オフラインで動作する。

関連ツール