.htaccess Generator for WordPressは、WordPressのための.htaccess生成ツールです。

セキュリティ強化やパフォーマンス向上をさせるための.htaccessのコードを生成することができます。

.htaccess Generator for WordPressの使い方

.htaccess Generator for WordPressにアクセスして、各種設定項目を選択していきます。

プリセット自動で最適な構成を設定
対象 Apache バージョン対象サーバーのApacheのバージョン
Options & ErrorDocumentディレクトリ一覧などのセキュリティ設定
ファイルアクセス制限ファイルへのアクセス制限
IP アドレスブロックIPアドレスによるブロック
リライトルールリライトルールの設定
セキュリティレスポンスヘッダーセキュリティレスポンスヘッダーの設定
キャッシュ & パフォーマンスキャッシュ等のパフォーマンス設定
wp-admin Basic 認証管理画面にBasic認証を設定
wp-content/uploads 保護アップロードフォルダのセキュリティ設定

「プレビュー」に生成されたコードが表示されるので、コピーもしくはダウンロードしてサーバーに設置します。

「wp-content/uploads 保護」を有効にした場合は、プレビューに[uploads]というタブが追加されます。[uploads]タブの.htaccessは、wp-content/uploadsフォルダに設置します。

おすすめ設定で出力される.htaccessのコード

一例として、プリセットの”おすすめ設定”で出力される.htaccessを紹介します。

ルート.htaccess

# BEGIN HtaccessGenerator
# Generated by .htaccess Generator - https://htaccess-generator-b46.pages.dev/

# ===========================
# セキュリティ設定
# ===========================
Options -MultiViews -Indexes

ErrorDocument 403 default
ErrorDocument 404 default

# XML-RPC へのアクセスを無効化
<Files xmlrpc.php>
	Require all denied
</Files>

# wp-config.php を保護
<Files wp-config.php>
	Require all denied
</Files>

# .htaccess へのアクセス禁止
<Files .htaccess>
	Require all denied
</Files>

# 特定のファイルタイプへのアクセスを制限
<FilesMatch "(?i)\.(inc|log|sh|sql)$">
	Require all denied
</FilesMatch>

# ===========================
# リライトルール
# ===========================
<IfModule mod_rewrite.c>
	RewriteEngine On

	# スラッシュの重複(//)を正規化
	RewriteCond %{THE_REQUEST} \s[^\s?]*//
	RewriteRule ^ %{REQUEST_URI} [R=301,L,NE]

	# 悪意のあるボット・スクリプトをブロック
	RewriteCond %{HTTP_USER_AGENT} (nikto|sqlmap|masscan|nmap|zgrab|wget|curl|httpie|python-requests|go-http-client|libwww-perl|scrapy|java/) [NC]
	RewriteRule .* - [F,L]

	# バックドア / マルウェア探索をブロック
	RewriteCond %{REQUEST_URI} (alfa\.php|alfaindex\.php|c99\.php|r57\.php|shell\.php|webshell\.php|b374k\.php|wso\.php|about\.php|lock360\.php|dark\.php|FilesMan\.php|cgialfa|wp-vcd\.php) [NC]
	RewriteRule .* - [F,L]

	# wp-* ディレクトリの多重ネストリクエストをブロック
	RewriteCond %{REQUEST_URI} wp-(content|admin|includes)/.*wp-(content|admin|includes)/ [NC]
	RewriteRule .* - [F,L]

	# wp-admin/includes/ への直接アクセスをブロック
	RewriteCond %{REQUEST_URI} ^/wp-admin/includes(?:/|$) [NC]
	RewriteRule .* - [F,L]

	# wp-includes/*.php への直接アクセスをブロック
	RewriteCond %{REQUEST_URI} ^/wp-includes/[^/]+\.php$ [NC]
	RewriteRule .* - [F,L]

	# HTTPS リダイレクト
	RewriteCond %{HTTPS} !=on [NC]
	RewriteCond %{HTTP:X-Forwarded-Proto} !https [NC]
	RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

	# 不正なクエリ文字列をブロック
	RewriteCond %{QUERY_STRING} (^|&)w=[^&]+(&|$) [NC]
	RewriteRule ^ - [R=410,L]

</IfModule>

# ===========================
# キャッシュ & パフォーマンス設定
# ===========================
# Gzip 圧縮
<IfModule mod_deflate.c>
	AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css
	AddOutputFilterByType DEFLATE application/javascript application/x-javascript application/json
	AddOutputFilterByType DEFLATE application/xml application/xhtml+xml application/rss+xml
	AddOutputFilterByType DEFLATE image/svg+xml
	AddOutputFilterByType DEFLATE font/ttf font/otf font/woff font/woff2
</IfModule>

# ブラウザキャッシュ設定
<IfModule mod_expires.c>
	ExpiresActive On
	ExpiresDefault "access plus 1 month"
	ExpiresByType text/css "access plus 1 year"
	ExpiresByType application/javascript "access plus 1 year"
	ExpiresByType application/x-javascript "access plus 1 year"
	ExpiresByType text/javascript "access plus 1 year"
	ExpiresByType image/jpeg "access plus 1 month"
	ExpiresByType image/png "access plus 1 month"
	ExpiresByType image/gif "access plus 1 month"
	ExpiresByType image/webp "access plus 1 month"
	ExpiresByType image/svg+xml "access plus 1 month"
	ExpiresByType image/x-icon "access plus 1 year"
	ExpiresByType image/vnd.microsoft.icon "access plus 1 year"
	ExpiresByType video/mp4 "access plus 1 month"
	ExpiresByType video/webm "access plus 1 month"
	ExpiresByType video/ogg "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 font/otf "access plus 1 year"
	ExpiresByType application/atom+xml "access plus 1 hour"
	ExpiresByType application/rdf+xml "access plus 1 hour"
	ExpiresByType application/rss+xml "access plus 1 hour"
	ExpiresByType application/json "access plus 0 seconds"
	ExpiresByType application/ld+json "access plus 0 seconds"
	ExpiresByType application/xml "access plus 0 seconds"
	ExpiresByType text/xml "access plus 0 seconds"
	ExpiresByType application/manifest+json "access plus 1 week"
	ExpiresByType text/html "access plus 0 seconds"
</IfModule>

# Cache-Control ヘッダー
<IfModule mod_headers.c>
	<FilesMatch "\.(css|js)$">
		Header always set Cache-Control "public, max-age=31536000, immutable"
	</FilesMatch>
	<FilesMatch "\.(jpg|jpeg|png|gif|webp|svg|ico)$">
		Header always set Cache-Control "public, max-age=2592000"
	</FilesMatch>
	<FilesMatch "\.(woff|woff2|ttf|otf)$">
		Header always set Cache-Control "public, max-age=31536000, immutable"
	</FilesMatch>
	<FilesMatch "\.(mp4|webm|ogv)$">
		Header always set Cache-Control "public, max-age=2592000"
	</FilesMatch>
	<FilesMatch "\.(html|htm)$">
		Header always set Cache-Control "no-cache, must-revalidate"
	</FilesMatch>
</IfModule>

# MIME タイプ追加
<IfModule mime_module>
	AddType image/x-icon .ico
	AddType image/svg+xml .svg
	AddType application/x-font-ttf .ttf
	AddType application/x-font-woff .woff
	AddType application/x-font-opentype .otf
	AddType application/vnd.ms-fontobject .eot
</IfModule>

# ETags を無効化
<IfModule mod_headers.c>
	Header unset ETag
</IfModule>
FileETag None

# ===========================
# セキュリティレスポンスヘッダー
# ===========================
<IfModule mod_headers.c>
	# HSTS(HTTPS 接続時のみ送信)
	Header always set Strict-Transport-Security "max-age=300" "expr=%{HTTPS} == 'on' || %{HTTP:X-Forwarded-Proto} == 'https'"

	# CSP
	<If "%{REQUEST_URI} !~ m#(?:^|/)wp-(admin(?:/|$)|login\.php)#">
		Header always set Content-Security-Policy-Report-Only "default-src 'self' https:; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; connect-src 'self' https:; frame-src 'self'; frame-ancestors 'self'"
	</If>
	<If "%{REQUEST_URI} =~ m#(?:^|/)wp-(admin(?:/|$)|login\.php)#">
		Header always set Content-Security-Policy-Report-Only "default-src 'self' https:; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline' 'unsafe-inline'; img-src 'self' data: https:; connect-src 'self' https:; frame-src 'self'; frame-ancestors 'self'"
	</If>

	# X-Content-Type-Options
	Header always set X-Content-Type-Options "nosniff"

	# X-Frame-Options(CSP の frame-ancestors と併用 - CSP 非対応の古いブラウザ向け保険)
	Header always set X-Frame-Options "SAMEORIGIN"

	# Referrer-Policy
	Header always set Referrer-Policy "strict-origin-when-cross-origin"

	# Permissions-Policy
	Header always set Permissions-Policy "camera=(), microphone=(), payment=(), usb=(), gyroscope=(), magnetometer=(), accelerometer=(), fullscreen=(), geolocation=()"
</IfModule>


# END HtaccessGenerator

uploads

# PHP 関連ファイルの実行を禁止
<FilesMatch "(?i)\.(?:php|phar|phtml)$">
	Require all denied
</FilesMatch>

あとがき

項目を選んでいくだけで自動でコードを生成してくれるのは楽で良いですね。

ただ、.htaccessの記述をミスるとサイトが表示できなくなってしまうのことがあるのでご注意ください。

投稿者

himecasのアバター

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Table of Contents