.htaccessでWordPressのパフォーマンスを向上させる

.htaccessの設定って、サーバーに疎いと敬遠しがち。だってよくわからないから。
なので、触らずに済むなら済ませたいし、触らずを得ない場合には教えてもらったコードをそのままコピペで「はい、終わり!」というケースが非常に多いです。
それでも「わかればすっごい便利だし、スマートに物事が解決することも多いんだろうなあ」とは常々思っているのも事実…。

たまたま見つけた以下のページが、解説付きで丁寧に紹介されていてとても勉強になりました。
WordPressサイト用の.htaccess例 | dogmap.jp

見えないところのちょっとしたチューニングって、渋いですよね。

導入してみました。

以下は.htaccessの記述ですが、dogmap.jp | 独断と偏見の何でもレビュー。since Feb. 27, 2005 さんで紹介されている方法そのまんまです…。

AddType image/x-icon .ico

<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
BrowserMatch ^Mozilla/4 gzip-only-text/ #gzip
BrowserMatch ^Mozilla/4\.0[678] no-gzip #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について

mod_deflateの概要をかなりざっくりと説明すると、「指定したファイルを圧縮してサイズを小さくして送る」ということでいいでしょうか?間違っていたらご指摘ください。

mod_deflateについて
Webサイトの高速化 ルール4 コンポーネントを圧縮しよう! (Yahoo! developer netoworkより翻訳) | 株式会社インターオフィス

ただ、以下のサイトで言及されていましたが、使用に適した環境と適していない環境があるようなので、そのあたりは自己責任で…。まったく効果がないだけでなく、逆に悪影響を及ぼす場合もあるようです。(その判断がまったくできない…。)
【帯域対策】Apacheのモジュールmod_deflateで転送量を大幅削減! – エーエイチレフ linuxサーバー技術情報

mod_expiresについて

mod_expiresの概要をざっくり説明すると、ファイルをキャッシュさせてページのロードを高速化させる機能です。多くは画像ファイルのキャッシュに使用していたらしいですが、それ以外のファイル(JavascriptやFlashファイルなど)もみんなキャッシュさせちゃおう、ってところでしょうか。また、キャッシュの有効期限も設定できます。
以下のサイトによるとこれが一番効果があるそうですが、有効期限を考えもなしも安易に設定するとかなり痛いことになるので、注意が必要ですね。
Webサイトの高速化 ルール3 Expiresヘッダーを追加しよう! (Yahoo! developer netoworkより翻訳) | 株式会社インターオフィス

ETagについて

ETagについてはこちらで詳しく説明されています。なんとなくわかりましたが、詳細はよくわかりません(笑)。
Webサイトの高速化 ルール13 ETagを正しく設定する! (Yahoo! developer netoworkより翻訳) | 株式会社インターオフィス

本来は便利な機能ですが、サーバー環境などによってはそうではなくなる場合もあるし、ETagの機能を使わなくてもいい場合ならオフにしときましょ、ということで合っているのかな?

アクセスされたくないファイルの指定

wp-config.php、wp-mail.php、install.phpにアクセスできないようにブロックします。

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

Order allow,denyですが、これ、記述の順序をいつも悩むんです。許可してから拒否?拒否してから許可?
今回の場合、順番としては、まず基本的にすべて許可して(Allow)、次に特定のファイルだけをアクセス拒否(Deny)する感じ?だから、Order allow,denyです。
アクセス制限の記述(Order, Allow, Deny) – アクセス制限 – Apache入門

404エラーの対処について

存在しないページのURLでアクセスされた場合に、Wordpressに404エラー出力させずに、Apacheに直接出力させるんだそうな。その方がサーバーの負荷が低くなります。なるほど、言われりゃその通りなんですが、そんな気配り思いつかない…。うーん、さすが。ということで、以下の一文をmod_rewriteの中に追加しているようです。

RewriteCond %{REQUEST_FILENAME} !\.(html?|xml|xsl|js|css|jpe?g|png|gif|ico)$

※URLの最後にhtmlが付くようにしている場合には、html?|を削除するように。

Wordpress, 備忘録 | , |