.htaccess ジェネレーター

Apache の .htaccess 設定をオンラインで即座に生成。HTTPS 強制リダイレクト、ブラウザキャッシュ、ディレクトリ一覧の無効化、カスタムリダイレクトに対応。登録不要。

  • ブラウザ内で処理
  • データはブラウザ外に出ません
  • 無料 · 登録不要
.htaccess
 

設定項目を選ぶと設定をプレビューできます。

詳しいガイドを読む .htaccessとは?Apache 2.4で確かめた書き方・読み込み条件・リダイレクトの落とし穴
例・詳しい説明・よくある質問 実際の出力つきの例、ほかのツールとの違い、よくある質問。

出力される設定の中身

  • 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、ファイルの中身は記録しません。