やらねば.com

Luxeritas 推奨 .htaccess 設定で Internal Server Error

SEO 最適化、多機能で高速を謳っている WordPress Theme Luxeritas の開発者さんが、テーマの公開と共に .htaccess による高速化の方法とサンプルコードを公開してくれています。
この .htaccess による高速化はテーマに適用するものではないので、他のテーマでも汎用的に使えるものとなっています。

Luxeritas 3.14.2 から Luxeritas 3.15.0 にアップデートしたタイミングで、テーマのパッケージに含まれる .htaccess のサンプルコードにも変更が有りました。
セキュリティ向上の為のコード追加と、重複したコードをまとめてコードをスリム化し、既存のコードにもいくつかの変更が加えられています。
Luxeritas 3.15.0 の .htaccess に追加して高速化するサンプルコードは


# MIME Type 追加
<IfModule mime_module>
	AddType text/cache-manifest .appcache
	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-woff2 .woff2
	AddType application/x-font-opentype .otf
	AddType application/vnd.ms-fontobject .eot
</IfModule>

<IfModule mod_headers.c>
	# プロクシキャッシュの設定 (画像とフォントをキャッシュ)
	<FilesMatch "\.(ico|jpe?g|png|gif|svg|swf|pdf|ttf|woff|woff2|otf|eot)$">
		Header set Cache-Control "max-age=604800, public"
	</FilesMatch>

	# プロキシサーバーが間違ったコンテンツを配布しないようにする
	Header append Vary Accept-Encoding env=!dont-vary

	# セキュリティ向上策
	Header set X-Frame-Options SAMEORIGIN
	Header set X-Content-Type-Options "nosniff"
	Header set X-XSS-Protection "1; mode=block"

	# Enable Keep-Alive を設定
	<IfModule mod_env.c>
		SetEnv KeepAlive On
		SetEnv KeepAliveTimeout 15
		SetEnv MaxKeepAliveRequests 100
	</IfModule>
	Header unset Connection
	#Header set Connection keep-alive

	# ETags(Configure entity tags) を無視する設定
	Header unset ETag

	# ブラウザキャッシュの設定
	<IfModule mod_expires.c>
		ExpiresActive On

		# キャッシュ初期化 (1秒に設定)
		ExpiresDefault "access plus 1 seconds"

		# MIME Type ごとの設定
		ExpiresByType text/css "access plus 1 weeks"
		ExpiresByType text/js "access plus 1 weeks"
		ExpiresByType text/javascript "access plus 1 weeks"
		ExpiresByType image/gif "access plus 1 weeks"
		ExpiresByType image/jpeg "access plus 1 weeks"
		ExpiresByType image/png "access plus 1 weeks"
		ExpiresByType image/svg+xml "access plus 1 year"
		ExpiresByType application/pdf "access plus 1 weeks"
		ExpiresByType application/json "access plus 1 weeks"
		ExpiresByType application/javascript "access plus 1 weeks"
		ExpiresByType application/x-javascript "access plus 1 weeks"
		ExpiresByType application/x-shockwave-flash "access plus 1 weeks"
		ExpiresByType application/x-font-ttf "access plus 1 year"
		ExpiresByType application/x-font-woff "access plus 1 year"
		ExpiresByType application/x-font-woff2 "access plus 1 year"
		ExpiresByType application/x-font-opentype "access plus 1 year"
		ExpiresByType application/vnd.ms-fontobject "access plus 1 year"
	</IfModule>
</IfModule>
FileETag None

# Gzip圧縮の設定
<IfModule mod_deflate.c>
	SetOutputFilter DEFLATE

	# 古いブラウザでは無効
	BrowserMatch ^Mozilla/4\.0[678] no-gzip
	BrowserMatch ^Mozilla/4 gzip-only-text/html
	BrowserMatch \bMSIE\s(7|8) !no-gzip !gzip-only-text/html

	# 画像など圧縮済みのコンテンツは再圧縮しない
	SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|ico|eot|woff|woff2)$ no-gzip dont-vary

	AddOutputFilterByType DEFLATE text/plain
	AddOutputFilterByType DEFLATE text/html
	AddOutputFilterByType DEFLATE text/xml
	AddOutputFilterByType DEFLATE text/css
	AddOutputFilterByType DEFLATE text/js
	AddOutputFilterByType DEFLATE image/svg+xml
	AddOutputFilterByType DEFLATE application/json
	AddOutputFilterByType DEFLATE application/xml
	AddOutputFilterByType DEFLATE application/xhtml+xml
	AddOutputFilterByType DEFLATE application/rss+xml
	AddOutputFilterByType DEFLATE application/atom_xml
	AddOutputFilterByType DEFLATE application/javascript
	AddOutputFilterByType DEFLATE application/x-javascript
	AddOutputFilterByType DEFLATE application/x-httpd-php
	AddOutputFilterByType DEFLATE application/x-font-ttf
	#AddOutputFilterByType DEFLATE application/x-font-woff
	#AddOutputFilterByType DEFLATE application/x-font-woff2
	AddOutputFilterByType DEFLATE application/x-font-opentype
	#AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
</IfModule>

症状が出たのは wpX クラウドですが、上記コードをそのまま .htaccess に追記すると 500 Internal Server Error が出てページにアクセス出来なくなります。
どうも wpX クラウドでは Keep-Alive の詳細設定までは許可していないらしく、下記コードの部分が問題になっている様です。


	# Enable Keep-Alive を設定
	<IfModule mod_env.c>
		SetEnv KeepAlive On
		SetEnv KeepAliveTimeout 15
		SetEnv MaxKeepAliveRequests 100
	</IfModule>
	Header unset Connection
	#Header set Connection keep-alive

この部分をまるっと削除するか、Luxeritas 3.14.2 以前で使われていたコード


	# Enable Keep-Alive を設定
	Header set Connection keep-alive

に修正したところ、500 Internal Server Error は出なくなりました。
公開されている .htaccess の高速化コードに問題が有る訳ではなく、サーバの仕様によるものなので、エラーが出なければそのまま使用しても良いですし、もし wpX 系のサーバで 500 Internal Server Error が出る様なら改善出来るかもしれません。