WordPressサイト用の.htaccess例

よりパフォーマンスの良い 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? を外してやってください。

WordPressサイト用の.htaccess例」への13件のフィードバック

  1. ピンバック: WordPressキャッシュプラグインの最終兵器「 WP Fastest Cache」

  2. sally

    執筆陣のみなさま、はじめまして
    最近WPで背伸びしたカスタマイズに挑戦しているものですが
    行き詰ってしまいこちらにお邪魔した次第です
    こちらのトピックには遠く及ばないような内容で大変恐縮ですが
    ヒントだけでもいただければと思い不躾ながらコメントさせていただきます

    現在、WPの投稿内にHTML5のvideoタグを使って動画をアップしようと試みています
    MediaElement.js – HTML5 Audio and Videoというプラグインを取り入れ設定自体はできたのですが、
    firefoxでのみ動画が再生されません
    クロームやIEでは、mp4ファイルの読み込みが問題なくできており再生に成功しているのですが、firefoxでは.ogv ファイル形式で読み込ませなければならないようです
    ファイル自体は用意できたのですが、さらに.htaccess内での設定記述もしてあげる必要があるということで以下のように書き換えました
    しかし、500エラーが出てしまい途方に暮れています

    # BEGIN WordPress

    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ – [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]

    # END WordPress

    SetEnvIf Request_URI “.*” AllowCountry

    SetEnvIf Request_URI “.*” WpLoginNoLimit

    -ここから追記-
    AddType video/ogg .ogg .ogv
    AddType video/mp4 .mp4
    AddType application/ogg .ogg .ogv
    -ここまで-

    なにか記述ルールが間違っているのでしょうか
    ちなみに、サーバーはxdomainの無料サーバーを使っており、管理画面からの編集が可能になっています
    パーミッションの設定や、コードタイプなどはここから更新すれば問題なく反映されると考えてよろしいでしょうか

    ヒントだけでもいただけましたら幸いです
    よろしくお願いします!

    返信
  3. ピンバック: WordPressをPageSpeed InsightsでAにするまでの記録

  4. ピンバック: プラグインは使わない!Wordpress カスタマイズまとめ40 | コムテブログ

  5. ピンバック: ウェッブページの表示の速度を調べる « スタッフのブログ

  6. ピンバック: 【wordpress】続・はじめの設定 | SBS

  7. ピンバック: WordPress へのアクセスを最適化する .htaccess のリダイレクト設定 | Odysseygate.com

  8. ピンバック: ITキヲスク | 2010年4/18〜4/24の週間ブックマーク

  9. ピンバック: 最近のWordpress関連の記事をまとめました

  10. ピンバック: [リンク] links for 2010/4/20 | Bonnie styles.

  11. ピンバック: 2010年4月20日のWebクリップ | HuIn.Log

コメントを残す

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください