WordPressサイト用の.htaccess例dogmap.jp

よりパフォーマンスの良い WordPress サイトを構築したいならば .htaccess ファイルを修正しましょう。
Webサーバに apache 2系を使用しているサイト用に、私が書いた .htaccess ファイルを元に解説します。

基本方針は

  • mod_deflate が使える場合は、有効にしてコンテンツを圧縮転送する。
  • mod_expires が使える場合は、有効にして画像ファイル等の静的ファイルをブラウザにキャッシュさせる。
  • 適切な ETag を発行して、ブラウザのキャッシュを制御する。
  • アクセスしてほしくない WordPress ファイルに対するアクセスをブロックする。
  • 存在しない静的ファイルに対してアクセスされた場合、WordPressを起動させない。

まず、私が作成した .htaccess ファイルを提示します。

AddType image/x-icon .ico

<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|ico)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI _\.utxt$ no-gzip
#DeflateCompressionLevel 4
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/atom_xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/x-httpd-php
</IfModule>

<ifModule mod_expires.c>
ExpiresActive On
ExpiresDefault "access plus 1 seconds"
ExpiresByType text/html "access plus 1 seconds"
ExpiresByType image/gif "access plus 2592000 seconds"
ExpiresByType image/jpeg "access plus 2592000 seconds"
ExpiresByType image/png "access plus 2592000 seconds"
ExpiresByType image/x-icon "access plus 2592000 seconds"
ExpiresByType text/css "access plus 604800 seconds"
ExpiresByType text/javascript "access plus 216000 seconds"
ExpiresByType application/x-javascript "access plus 216000 seconds"
ExpiresByType application/x-shockwave-flash "access plus 216000 seconds"
</ifModule>

FileETag none

<FilesMatch "^(wp-config\.php|wp-mail\.php|install\.php|\.ht)">
order allow,deny
deny from all
</FilesMatch>

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !\.(html?|xml|xsl|js|css|jpe?g|png|gif|ico)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

mod_deflate が使える場合は、有効にしてコンテンツを圧縮転送する

テキストファイルを gzip 圧縮転送して転送量を減らし、表示の高速化を図ろうという設定です。
この設定が、なぜ有効かは、「Webサイトの高速化 ルール4 コンポーネントを圧縮しよう! 」辺りを参考にしてください。

3〜21行目が、mod_defrate を有効にしてコンテンツを圧縮転送するための設定です。
5〜7行目でブラウザが gzip 圧縮転送に対応しているか確認しています。
8〜9行目では、画像ファイルなどの gzip 圧縮転送しても、サイズが小さくならないファイルに対するアクセスの場合は対象外になるように設定しています。
11〜20行目で、実際に gzip 圧縮転送の対象になるファイルの mime タイプを指定しています。

mod_expires が使える場合は、有効にして画像ファイル等の静的ファイルをブラウザにキャッシュさせる

静的ファイルに有効期限を設定し、閲覧者のブラウザにあるキャッシュを有効に使ってもらおうという設定です。
この設定がなぜ有効かは、「Webサイトの高速化 ルール3 Expiresヘッダーを追加しよう! 」辺りを参考にしてください。

23〜35行目が、Expiresヘッダをセットするための設定です。
25行目で、デフォルトの有効期限を1秒に設定しています。
26〜34行目ではファイルの mime タイプにより、有効期限を設定しています。

  • gif, jpg, png 等の画像ファイルは30日( = 2,592,000秒 )
  • css は7日( = 604,800秒 )
  • javascript, flash は2.5日( = 216,000秒 )

で設定しています。
これらの数字に根拠は無いので、運用に合わせて適宜変更してください。

適切な ETag を発行して、ブラウザのキャッシュを制御する

これも、キャッシュに絡む話。
有効期限が切れたブラウザ内のキャッシュファイルが変更されているかどうかは ETag を使ってチェックされるので、適切に出力してあげようという設定です。
この設定がなぜ有効かは、「ETagを正しく設定する!」辺りを参考にしてください。

37行目で、ETag を none に設定しています。

アクセスしてほしくない WordPress ファイルに対するアクセスをブロックする

これは、パフォーマンスアップのための設定では無いですが、以下の3ファイルについて外部からのアクセスを拒否しています。

  • wp-config.php WordPress の設定ファイル
  • wp-mail.php メール投稿を受信するための WordPress コアファイル。Ktai Entry, wp-shot 等のプラグインで代替可
  • install.php WordPress インストール用のコアファイル。install 後は不要

39〜42行目で設定しています。

存在しない静的ファイルに対してアクセスされた場合、WordPressを起動させない

例えば、あなたのサイト( http://example.com/ )に favicon.ico が存在しない場合、http://example.com/faviccon.ico に対してアクセスがあった場合、WordPress のデフォルト設定のままだと、WordPress が起動してファイルの有無をチェックします。
ファイルが無いことは Apache でもわかっているのに、わざわざ WordPress を起動するのは、いたずらにサーバの負荷を増やすだけです。
# 特に favicon.ico は、多くのブラウザがあるかどうかチェックにくるファイルです。

で、そういった無駄なサーバ動作を減らすために48行目を追加してやります。
通常 WordPress を導入したサイトでは、指定された URL に合致するファイルが見つからない場合、WordPress を起動して処理を行いますが、48行目を追加することで静的ファイル( html|xml|xsl|js|css|jpeg|png|gif|ico )が存在しない場合は、WordPress が処理せずに直接 Apache が404を返すようになります。
ただし、WordPress のパーマリンクを *.html 等に設定している場合は、指定から html? を外してやってください。

このブログで関連すると思われる他の投稿