.htaccess ジェネレーター
Apache の .htaccess 設定をオンラインで即座に生成。HTTPS 強制リダイレクト、ブラウザキャッシュ、ディレクトリ一覧の無効化、カスタムリダイレクトに対応。登録不要。
- ブラウザ内で処理
- データはブラウザ外に出ません
- 無料 · 登録不要
WeChat でスキャンしてシェア
例・詳しい説明・よくある質問 実際の出力つきの例、ほかのツールとの違い、よくある質問。
出力される設定の中身
- HTTPS 強制:
%{HTTPS}がoffのとき、同じホストのhttps://へ 301 で転送する RewriteRule です。mod_rewriteが必要で、<IfModule mod_rewrite.c>で囲まれているため、モジュールがないサーバーではエラーにならずに無視されます。 - WWW リダイレクト:「www を強制」か「www を削除」のどちらかに統一します。転送先は、HTTPS 強制をオフにしていても常に
https://です。 - ディレクトリインデックス:ディレクトリにアクセスされたとき Apache が順に探すファイルです。初期値は
index.php index.html index.htmで、欄が空か空白だけのときはindex.php index.htmlと出力されます。ファイル名の間の全角スペースは半角スペースとして扱います。Apache は半角の空白でしか区切らないためです。 - ブラウザキャッシュ:
mod_expiresで画像、CSS/JavaScript、フォントにExpiresとCache-Control: max-ageを付けます。MIME タイプごとにExpiresByTypeを 1 行ずつ書くので、Apache が一覧にないタイプで返したファイルにはヘッダーが付きません。 - セキュリティ:ディレクトリ一覧を止め(
Options -Indexes)、.htaccessと.envへの直接アクセスをRequire all deniedで拒否します。ヘッダー(X-Content-Type-Options: nosniff、X-Frame-Options: SAMEORIGIN、Referrer-Policy: strict-origin-when-cross-origin、X-XSS-Protection: 0)は初期状態ではオフです。X-XSS-Protectionを0にするのは OWASP HTTP Headers Cheat Sheet の推奨です。 - カスタムリダイレクト:リダイレクト元とリダイレクト先の両方を入力すると、
Redirectディレクティブを 1 行出力します。種類は 301 か 302 です。
例:初期状態のまま出力した場合
ページを開いた直後の設定(HTTPS 強制、ディレクトリインデックス、ブラウザキャッシュ、セキュリティの最初の 3 項目)では、次のファイルが出力されます。
# Force HTTPS
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
# Directory Index
DirectoryIndex index.php index.html index.htm
# Browser Caching
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/svg+xml "access plus 1 year"
ExpiresByType image/webp "access plus 1 year"
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
ExpiresByType text/javascript "access plus 1 month"
ExpiresByType font/woff "access plus 1 year"
ExpiresByType font/woff2 "access plus 1 year"
ExpiresByType font/ttf "access plus 1 year"
ExpiresByType application/x-font-ttf "access plus 1 year"
ExpiresByType application/vnd.ms-fontobject "access plus 1 year"
</IfModule>
# Security
Options -Indexes
<Files ".htaccess">
Require all denied
</Files>
<Files ".env">
Require all denied
</Files>
Apache 2.4.67 で AllowOverride All のディレクトリに置いて HTTP でアクセスすると、/ は 301 になり、/.env と /.htaccess は 403 でした。フォントに font/ttf と application/x-font-ttf の両方があるのは、Apache 2.4 同梱の mime.types が .ttf を font/ttf にしている一方、古い設定では x- 付きの名前が使われているためです。
例:エックスサーバーで常時 SSL 化と www なしをまとめる
エックスサーバーのマニュアル「Webサイトの常時SSL化」によると、独自 SSL を設定しただけでは https:// へ自動で転送されず、サーバーパネルの「.htaccess編集」で転送の記述を追記します。追記先は既存の設定を残した先頭が推奨されています。同じページには、サーバーパネルの「ドメイン設定」で対象ドメインの詳細を開き、HTTPS転送設定の「HTTPSに転送する」にチェックを入れる方法も載っています。.htaccess で書く場合は、ジェネレーターで「WWW リダイレクト」をオンにして「オプション」の「www を削除」を選び、HTTPS 強制以外の項目(「ディレクトリインデックス」「ブラウザキャッシュ」「セキュリティ」)はオフにします。
# Force HTTPS
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
# Remove www
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ https://%1%{REQUEST_URI} [L,R=301]
</IfModule>
マニュアルの記述は RewriteCond %{HTTPS} !on で、ジェネレーターは off と書きますが、意味は同じです。Apache 2.4.67 で http://www.example.jp/ を開くと、最初の 301 の転送先は https://www.example.jp/ でした。規則は上から順に適用され、1 回目は HTTPS 強制だけが働くからです。転送先の HTTPS ページでは %{HTTPS} が on になり、今度は「www を削除」の規則で https://example.jp/ へもう一度転送されます。往復は 2 回になりますが、最終的な URL は 1 つにそろいます。
サーバーパネルの「.htaccess編集」が編集するのはドメインの public_html/.htaccess で、UTF-8 で保存されます。マニュアルにあるとおり、このファイルにはパネルの機能や WordPress が書き込んだ記述が入っていることがあるので、置き換えずに追記してください。
例:キャッシュ期間をパネルより長くする
エックスサーバーの「ブラウザキャッシュ設定」は、各項目を最大 7 日間保持する値を指定する機能で、.htaccess で Expires ヘッダーを設定している場合はそちらが優先されます。CSS と JavaScript を 1 週間、画像を 3 か月、フォントを 1 年にしたい場合、「ブラウザキャッシュ」だけをオンにして期間を選ぶと次のようになります。
# Browser Caching
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpeg "access plus 3 months"
ExpiresByType image/png "access plus 3 months"
ExpiresByType image/gif "access plus 3 months"
ExpiresByType image/svg+xml "access plus 3 months"
ExpiresByType image/webp "access plus 3 months"
ExpiresByType text/css "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType text/javascript "access plus 1 week"
ExpiresByType font/woff "access plus 1 year"
ExpiresByType font/woff2 "access plus 1 year"
ExpiresByType font/ttf "access plus 1 year"
ExpiresByType application/x-font-ttf "access plus 1 year"
ExpiresByType application/vnd.ms-fontobject "access plus 1 year"
</IfModule>
Apache 2.4.67 では、CSS に Cache-Control: max-age=604800(7 日)、TTF に max-age=31536000(365 日)が付きました。CSS や JavaScript のファイル名にバージョンを付けていない場合、一度読み込んだブラウザーは、期限が切れるまで更新前のファイルを使い続けることがあります。
制限とよくあるエラー
- 500 Internal Server Error:ディレクティブはすべて、そのディレクトリの AllowOverride で許可されている必要があります。
AllowOverride FileInfoの環境では、Options -Indexesの 1 行だけでディレクトリ全体が 500 になりました。 - すべてのページが 403:
.htaccessのRewriteRuleにはOptions FollowSymLinksかSymLinksIfOwnerMatchが必要です。両方オフだと、規則に到達したリクエストはすべて拒否されます(エラーログ AH00670)。 - CDN やロードバランサーの後ろで転送が止まらない:
%{HTTPS}は Apache 自身が受けた接続を表します。手前のプロキシが TLS を終端して Apache には HTTP で渡す構成では常にoffになり、HTTPS 強制が繰り返されます。プロキシ側で HTTPS にするか、プロキシが付けるヘッダーを条件にしてください。 - 「www を強制」はサブドメインにも効く:
www.で始まらないホストすべてにwww.を付けるので、blog.example.jpはwww.blog.example.jpに、IP アドレスにも前置されます。 - 名前が完全一致するファイルだけを守る:
.envのブロックは.env.localや.env.productionを守りません。こうしたファイルはドキュメントルートの外に置きます。 - リダイレクト元は「/」から:Redirect のリダイレクト元はスラッシュで始まるパスで、相対パスは使えません。
Redirect 301 old-page …は Apache 2.4.67 でエラーにならずに読み込まれ、/old-pageへのリクエストは転送されませんでした。そのため、リダイレクト元が/で始まらないときは、ジェネレーターはこの行を出力せず、「コピー」の下の状態表示でエラーを知らせます。ほかの規則はそのままコピーできます。 - パスの途中に空白を入れない:リダイレクト元やリダイレクト先 URL の途中に空白があると、
Redirectの行は引数が 4 つになり、Apache 2.4.67 ではディレクトリ全体が 500 になりました(エラーログは「Redirect takes one, two or three arguments」)。ジェネレーターはエラーを表示し、この行を出力しません。リダイレクト先の空白は%20と書きます。空白を含むリダイレクト元は、ファイルを手で編集してパスを引用符で囲みます(Redirect 301 “/old page” …は同じ検証で転送されました)。 - カスタムリダイレクトは 1 件だけです。複数必要なら
Redirectの行をコピーして書き換えます。Basic 認証、CORS、gzip / Brotli 圧縮の項目はありません。パスワードファイルは htpasswd 生成ツールで作れます。
FAQ
.htaccess ファイルとは何ですか?
Apache Web サーバーがディレクトリごとに読む設定ファイルです。メインの設定ファイルを編集しなくても、そのディレクトリの URL リダイレクト、キャッシュ、アクセス制御、セキュリティヘッダーを設定できます。ただし Apache が実行するのは、そのディレクトリの AllowOverride で許可されたディレクティブだけです。
Nginx や他のサーバーでも使えますか?
.htaccess は Apache の形式です(LiteSpeed も読み込みます)。Nginx は設定の書き方が異なり、.htaccess を読みません。Nginx で動かす場合は、同じ内容を nginx.conf のディレクティブに書き直す必要があります。
アップロードしたらサイトが 500 Internal Server Error になりました。
そのディレクトリの AllowOverride で許可されていないディレクティブが .htaccess にあると、Apache は 500 を返します。たとえば AllowOverride に Options が含まれていないのに Options -Indexes を書くと、エラーログに「Options not allowed here」と記録されます。その行を削除するか、サーバー会社に許可を依頼してください。
.htaccess 自体へのアクセスを拒否しても問題ありませんか?
問題ありません。サーバー側ですでに拒否していても衝突しません。Apache 2.4 に同梱の httpd.conf には、もともと <Files ".ht*"> と Require all denied の設定があります。生成されるブロックも同じ Apache 2.4 の Require(mod_authz_core)を使います。Apache 2.2 の Order / Deny の書き方は、2.4 では mod_access_compat を読み込んだときだけ動きます。
301 リダイレクトと 302 リダイレクトの違いは何ですか?
301 は恒久的な転送で、ブラウザーは転送先を記憶し、検索エンジンは登録する URL を新しいものに切り替えます。302 は一時的な転送で、クライアントは毎回元の URL を確認し直します。ドメインの移転や URL の正規化には 301、短期間の転送には 302 を使います。
入力した設定はどこかに送信・保存されますか?
されません。ファイルはブラウザーのページ内で、選んだ設定から組み立てられます。設定はサーバーに送られず、ブラウザーのストレージにも保存されないので、ページを再読み込みすると初期値に戻ります。「コピー」を押したときにサイトのアクセス解析が記録するのはツール名と操作だけで、パス、URL、ファイルの中身は記録しません。