先日WordPress brandingWordPressセキュリティの徹底強化についてご紹介したので、今度はややこしいと巷で有名な「.htaccess」に関してお話したいと思います。ひとしきりWordPressダッシュボードプラグインテーマなどをいじったら、次はまた大きな一歩を踏み出さねばなりません。まずはこのアーティクルでどんな話をするのか、説明しましょう。

wp htaccess .htaccessをWordPressで徹底活用

Image credit: ptz0n

この記事は、http://www.onextrapixel.com/ の許可を得て、翻訳しています。一部変更して翻訳している部分もある場合があります。オリジナルの記事はここよりご覧いただけます。

WordPressのカテゴリページにアクセスすると、以下のようなURLが表示されるかと思います。

www.YourDomain.com/category/CategoryName
   

個人的にこの「category」という単語はあまり好きではないのですが、WordPressがレンダーしてくるのはこのURLですよね。 「.htaccess」を使えば、この「category」部分を排除して、URLをもっとプロっぽく見せることが出来ます。.htaccessファイルを理解すればもっともっと変更出来る部分は拡がります。

それでは.htaccessファイルをいじる前に基本的なことをおさらいしておきましょうか。

そもそも.htaccessとは?

.htaccessは元々はHypertext Accessの略です。コンフィグファイルの1つで、配置されたディレクトリとそれに関連するサブディレクトリを制御する権限があります。独自の機能を制御する為にApache系のWEBサーバーで使用されます。きっと使ってみればすぐに慣れると思いますよ。

NOTE: Windowsベースホスティングの.htaccessファイルはまた全く別の話です。このアーティクルではLinuxベースのホストに関してお話していきます。

   

.htaccessとApache

   

.htaccessファイルとApacheの関係を分かり易くする為に、以下の画像を作ってみました。WordPressとWEBサーバ(ここではApache)がどの様な位置関係にあるかにご注目下さい。これは非常にざっくりとした解説でしかないのですが、リアルタイム環境でのデータフローを理解するには充分なのではないかと思います。
   

htaccess .htaccessをWordPressで徹底活用
   

上記の画像でご覧いただける通りApacheは.htaccessを経由して進むのですが、Apacheは指示されたものはそのまま持ち込んでしまいます。その為.htaccessは、もし何か複雑な変更が必要な場合でも素人にApacheを触らせないというApacheに対するシールド機能の働きもします。これは言い換えてみると、WEBマスターとしてはhttpd.confを触らずとも.htaccessを編集することによりデータフローや表示結果を変更出来ると言うことを意味します。
   

   

では何故直接httpd.confを編集しないのか?

   

先ほどの説明をご覧いただくと、当然こういう疑問が湧いて来ますよね。このブログをご覧になっている殆どの方は、何らかの形での共有ホストをお使いになっているのではないかと思います。それが何を意味するかというと、1つのサーバがあなたのWEBサイトだけではなく他の多数のWEBサイトをも走らせているということになります。従ってhttpd.confファイルをいじるということは、他のWEBサイトに影響を与える可能性も出てきてしまいます。例えhttpd.confファイルに重要な記述がされていないとしても、他のWEBサイトに影響を及ぼす可能性がある限りホスティング会社はhttpd.confファイルを触らせてはくれるはずがありませんよね。けれど.htaccessファイルを使えば、他のサイトに影響を与えることなくhttpd.confファイルを書き換えたかのような操作をすることが可能となります。これでスッキリしましたか?
   

   

ここまでの説明ではっきりしたことをまとめてみましょう。
   

  • .htaccessファイルで出来ることは何でもhttpd.confファイルでも実現可能です。
  • httpd.confファイルで出来ることは何でも.htaccessファイルでも実現可能というわけではありません。

.htaccess編集前に知っておくべきこと

.htaccessファイルをさわり始める前に、以下のポイントを押さえておきましょう。

  • .htaccessファイルには所有者をもドメイン(FTPやcPanelといったツールを含み)から締め出してしまう様な機能もあります。その為、今自分が何をしているのかきちんと把握しながら作業を進めましょう。
  • ワードラップ機能の付いたエディターを使用している場合は、.htaccessファイルを編集する前にワードラップ機能を無効にすることをお勧めします。Apacheなら問題ないかと思いますが、もしかしたら誤作動を引き起こすことがあるかもしれません。
  • 余分なコード(同じことを目的とした別々のコードセットなど)は避けてください。結果として無限ループを引き起こし、閲覧者が抜け出せなくなる可能性があります。
  • サブディレクトリへの変更はそのサブディレクトリ内に別の.htaccessファイルを置き、そちらのファイルから特定のコードを削除することにより避けることが可能となります。
  • RewriteCondを使用する場合は、<IfModule mod_rewrite.c>と</IfModule>の行の間に記述する必要があります。こうすることによりmod_rewriteと呼ばれるApacheの書き換えエンジンを有効化します。もしご利用のApacheでは既に有効化されていたら不要な作業なのですが、ご自身の.htaccessファイルで再度有効化させておいても問題ありません。
  • いざ.htaccessファイルを開いた時に、既にいくつかのコードが書き込まれている可能性が極めて高いです。これはWordPressのパーマリンク構造に必要なデフォルトなものなので、決して触らないように気を付けてください。参考までに記載しておきますね。

    WordPressがルートディレクトリにインストールされている場合

    # BEGIN WordPress
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    </IfModule>
    # END WordPress
       

    WordPressが「blog」というサブディレクトリにインストールされている場合

    # BEGIN WordPress
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /blog/
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /blog/index.php [L]
    </IfModule>
    # END WordPress
       

       

  • 変更事項はまずはサブディレクトリでテストしてみてください。
  • バックアップを忘れずに!WordPressにいかなる変更を加える前に、既存の.htaccessファイルをバックアップする必要性を説いた方がいいですか?答えは「Yes!」ですよね。いくつかのプラグインにはデフォルトに切り替える習性を持っているものがあります。そういった問題を回避する為に.htaccessファイルは必ずバックアップを取っておきましょう。




   

.htaccessファイルの保護

   

WordPressのセットアップをリモデルする前に、.htaccessファイルをきちんと保護しておかなければなりません。以下のコードは、外部からの.htaccessファイルに対するいかなるアクセスからも保護してくれます。ファイル名のケースセンシティブのところもきちんと賄ってあるので、ファイル名が.hTACcesSだったとしても、問題なく保護されます。
   

<Files ~ "^.*\.([Hh][Tt][Aa])">
 order allow,deny
 deny from all
 satisfy all
</Files>
   

   

wp-config.phpファイルの保護

   

先ほどのコードはWordPress内の重要なファイルはどんなものでも保護してくれます。下記の場合はwp-config.phpファイルを保護しています。
   

<files wp-config.php>
order allow,deny
deny from all
</files>
   

   

WordPress内のディレクトリを非表示

  

先日のアーティクルでご紹介した通り.htaccessファイル内で下記のコードを使えば、WordPress内のディレクトリのパブリックビューイングを制限することが可能になります。
   

Options ?Indexes
   

  

こうすることにより変更を加えた特定のディレクトリ内のサブディレクトリへのアクセスをブロックします。
   

   

特定のIPアドレスをブロック

   

もし何らかのIPアドレスがネットワークに障害をきたしていることが分かったら、以下のコードを使ってそのIPアドレスをブロックすることが出来ます。
   

<Limit GET POST>
order allow,deny
deny from xxx.xxx.xxx.xxx
deny from yyy.yyy.yyy.yyy
allow from all
</Limit>
   

   

スパムボットからのコメント拒否

   

WordPressのwp-comments-post.phpファイル有効時に誰かがコメントを残した場合、ブラウザは関連するラインを戻します。スパムボットがコメントを残した場合はwp-comments-post.phpファイルに直接ヒットするので、関連ラインは生成されません。以下のコードはそのようなスパム活動を検出し、スパムボットにそのまま送り返してしまいます。丁度あなた自身のAkismetを作ってしまうような感じです。
   

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{REQUEST_URI} .wp-comments-post\.php*
RewriteCond %{HTTP_REFERER} !.*yourdomain.com.* [OR]
RewriteCond %{HTTP_USER_AGENT} ^$
RewriteRule (.*) http://%{REMOTE_ADDR}/$ [R=301,L]
</IfModule>
   

   

NOTE:4行目のyourdomain.comをwwwを除いたご自身のブログURLや他のプリフィックスに変更してください。
   

   

IPアドレスによるwp-adminフォルダへのアクセス制限

   

wp-adminフォルダはWordPressにとって中核であり、もしハッカーにアクセスされてしまったらそれでもうおしまいです。そのような事態を避ける為に、あなたのIPアドレス以外はwp-adminフォルダへのアクセス権が無いよう制限してしまえばよいのです。以下のコードをルートの.htaccessファイルに書き加え、wp-adminフォルダの中に配置します。こうすることにより変更はwp-configディレクトリ内のみに適用されるようになります。
   

<LIMIT GET>
order allow, deny
deny from all
allow from xx.xx.xx.xx
</LIMIT>
   

   

NOTE:今回の制限を適用させる為には、ISPからの静的IPアドレスが必須となります。また「allow from」という行を加えれば、アクセス権のあるIPアドレスを追加することも出来ます。
   

   

ホットリンクの無効化

   

もし他のWEBサイトが自分のディスクにコピーして再アップロードするのではなく、直接あなたのサーバ上にある画像をそのままソース元とした場合、あなたのディスク容量とバンド幅が消費されてしまいます。これが所謂「ホットリンク」と呼ばれ、貴重なディスクスペースを節約する為にブロックする必要があります。
   

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?YourDomain.com [NC]
RewriteCond %{HTTP_REFERER} !^http://(www.)?TrustedDomain.com/.*$ [NC]
RewriteRule \.(jpg|jpeg|png|gif)$ http://YourDomain/images/HotlinkingNotPermitted.gif [NC,R,L]
</IfModule>
   

   

NOTE:コード内のYourDomain.comは、wwwを除いたあなたのブログのURLに置き換えてください。それからオプションとしてTrustedDomain.comは、ホットリンクを許可したい他のWEBサイトを追加したい場合に置き換えて使ってください。また、http://YourDomain.com/images/HotlinkingNotPermitted.gifの部分は、誰かがあなたの画像をホットリンクした場合に表示される画像です。折角なら彼らの一枚上手をいきましょう。
   

   

メンテナンス中の置換ページ表示

   

テーマブログを変更したり新しいプラグインをテストする必要がある場合、ブログへの訪問者をメンテナンスページへ誘導することをお勧めします。このテクニックは通常、訪問者達にそのWEBサイトがメンテナンス中であることとその予定期間をお知らせする為に用いられます。下記のコードをお使いください。
   

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_URI} !/maintenance.html$
RewriteCond %{REMOTE_ADDR} !^123\.456\.789\.000
RewriteRule $ /maintenance.html [R=302,L]
</IfModule>
   

   

maintenance.htmlはあなたのWEBサイト上でメンテナンスページとして使用したいページに置き換えてくださいね。それから3行目の数字はあなたのIPアドレスに書き換えるのを忘れないようにしてください。そうしないと自分自身もアップグレード中にメンテナンスページしか表示されないという憂き目をみることになってしまいます。
   

   

キャッシュ利用で速度アップ

   

ブログのロード時間が遅くなるのは結構致命的です。そんな時は下記のコードが便利です。このコードを使うと、ブラウザ上のキャッシング枠を増加してくれるキャッシュ制御ヘッダーをブログに追加することが出来ます。それにより当然ブログのロード時間は短縮出来ます。このコードはそんなに説明せずともご覧いただければ理解出来ちゃうと思います。
   

<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access 1 year"
ExpiresByType image/jpeg "access 1 year"
ExpiresByType image/gif "access 1 year"
ExpiresByType image/png "access 1 year"
ExpiresByType text/css "access 1 month"
ExpiresByType application/pdf "access 1 month"
ExpiresByType text/x-javascript "access 1 month"
ExpiresByType application/x-shockwave-flash "access 1 month"
ExpiresByType image/x-icon "access 1 year"
ExpiresDefault "access 2 days"
</IfModule>
   

   

実際に自分のブログで試してみましたが、結果は有効でした。下記のスクリーンショットはブラウザのキャッシュコード無しの場合です(Chrome用Page Speed利用)。
   

compuword1.1 .htaccessをWordPressで徹底活用
   

次の画像はキャッシュコードを有効にした場合です。ブログの元々のロード時間が速かったのでスコアは1つしか変わっていないのですけれどね。
   

compuworld2.1 .htaccessをWordPressで徹底活用
   

再確認の為に自分の他のブログでも試してみたのですが、そちらではスコアが84から90に跳ね上がりました!これは効きますよ!
   

   

パーマリンクから「/year/month/day/」を削除

   

色んな方法がネット上で出回っていてどれも大抵うまく機能するかと思いますが、私がおススメするのはこちらの方法です。覚えておいていただきたいのが、Googleが新しいURLをリインデックスするまでのしばらくの間はGoogle JuiceやPageRankを失うことがあります。トラフィック自体は2、3週間で戻ってくるかと思いますがPRの復旧にはそれ以上かなりの時間が必要です。今後もしリスクを冒したくない方は、スルーしてくださいね。そんなに重要なことでもありませんので・・・。結局のところ、TechCrunchも同じような感じで何やら無意味に長いパーマリンクを使ってますしね。
   

   

NOTE:パーマリンクから/category/部分を削除すると、SEOに基づく条件に影響してきます。
   

それでは手始めに、パーマリンク構造を、こちらから

/%year%/%monthnum%/%day%/%postname%/

こちらへ

/%postname%/

変更しましょう。

.htaccessファイルの中から、WordPressのデフォルトのリダイレクトルールを探し、下記のコードをリダイレクトルールの上に足してください。

RedirectMatch 301 /([0-9]+)/([0-9]+)/([0-9]+)/(.*)$ http://www.domain.com/$4

この時domain.comをご自身のブログURLに変更することを忘れないでくださいね。

   

パーマリンクから/category/を削除

   

最初にお約束した通り、パーマリンクから/category/を削除しましょう。下記のコードを.htaccessファイルに貼り付けてください。場所はWordPressで使用しているパート内にある最初のRewriteRuleの上です。文章だけだと分かり難いと思いますので、実際コードを貼り付けると最終的に下記のような状態になっているかと思います。
   

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^category/(.+)$ http://mydomain.com/$1 [R=301,L]
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
   

   

終わりに・・・

   

これで.htaccessファイルで出来ることは殆ど全てカバーしているかと思います。勿論他にも色々と変更出来ることはありますが、1つのアーティクルでお話するにはこの位が丁度良いのではないかと思います。もしタイプミスや役立つ情報があればぜひ教えてください。