›nginxでFeedBurnerのクローラーだけ受け入れる方法nginxでFeedBurnerのクローラーだけ受け入れる方法つい先日、このブログ(WordPress)をようやくApache無し、nginxだけで動かすことに成功しました。ところが今日、ふと変なことに気づいた。RSSが更新されていない・・・。このブログのRSSはFeedBurnerに流していました。一般の方がRSSを見た場合はFeedBurnerを見に行くようにしていたんです。今回Apacheからnginxにリプレースした際も、RSSを見に来た人をFeedBurnerにリダイレクトさせる(飛ばす)ようにしました。これじゃFeedBurnerさんは更新情報を取れないですな。クローラーもFeedBurnerに飛ばされちゃうんだものwというわけで本題。今回は下記のように設定します。)を見た場合はFeedBurnerに移動するようにします。FeedBurnerのクローラーだけはRSSを読めるようにします。訪問者のユーザーエージェントを見て識別します。FeedBurnerのユーザーエージェントは「FeedBurner/1.0」らしい。プロキシのserver部分に判別処理を書きます。last;break;}(以下省略)[/crayon]こんな感じ。参考にどうぞ(・∀・)!関連記事そのnginxのキャッシュ、ちゃんとpurgeされていますか?ブログのトップURLが間違ってGoogleに登録されてしまったどうしようこのブログのサーバーをnginx+Apacheの環境に引っ越ししました。FeedBurnerの利用には、リダイレクトルールをRewriteする方法がオススメです。FeedburnerのようなプラグインはApacheでの動作を前提としておりますので、NGINXではリダイレクトルールがうまく働きません。プラグインは一見便利そうに見えて、サーバとの連携が上手くいかないと途端にポンコツ化するので注意が必要です。Apacheならいいんでしょうね、Apacheなら...。件の実現を結論から書くと、RewriteルールをNGINX設定ファイルのserverブロックに記述します。}※リバースプロキシを使用している場合は、フロントエンド(80番ポート)のserverブロックの方に記述します。これによってFeedBurnerエージェントのアクセス以外は、キチンとブログフィードをFeedBurnerへリダイレクトするようになります。ここから先は本記述に至るまでのプロセスメモになります。Feedburnerプラグインを使用していました。いちおうブログに見えているフィードアイコンはきちんとFeedBurnerアドレスを示していたので気づかなかったのですが、ふとサーバの方を見ると、Wordpressの.htaccessにこんな記述がありました。Feedburnerはブログフィードのリンク先をFeedBurnerへと置換するプラグインです。クローラ等が/feed/などへ直接アクセスする際には.htaccessのリダイレクトルールで対応していたようでした。ところがNGINXでは.htaccessは使えません。Apacheなら問題ないのですが、NGINXをWebサーバとして使用する以上、.htaccessではなくNGINXの設定ファイルの方でRewriteを記述していくしかありません。Feedburnerと別れを告げました。FeedBurnerという組み合わせで運営する方法では以下のブログがまず見つかりました。nginxでFeedBurnerのクローラーだけ受け入れる方法,Azrael件のコード部分を引用します。locationブロックを使った対応です。)を見た場合はFeedBurnerに移動するようにします。FeedBurnerのクローラーだけはRSSを読めるようにします。その意図を実現する上記のコードについて、紐解いていきましょう。次に示す、最も外側のスコープです。}これは「feedで始まるアドレスへのアクセスがあった場合」という条件分岐になります。RSSフィードへアクセスがあれば、このlocationブロックが対応します。}これは「アクセスしてきたユーザエージェントがFeedBurnerであった場合」という条件分岐になります。FeedBurnerのクローラがアクセスしてきたら、リバースプロキシに直接通してあげよう、つまり勝手にリダイレクトせずにブログを直接見せてあげようというルールになります。これによってFeedBurnerのクローラだけはRSSが読めるようになります。break;これは先ほどの条件分岐の先にあるので、「FeedBurner以外のアクセスだった場合」に、「feedへのアクセスをFeedBurnerへリダイレクトする」というルールになります。これで確かにブログフィードへのアクセスがあった場合に、FeedBurnerクローラとそれ以外とを分け、適切にリダイレクトするルールが完成しています。Serverブロックで対応する先ほどのlocationブロックの記述でも十分対応できるのですが、コードがやや長めです。いうのも、アクセス先(feedかどうか)をチェックするユーザエージェントをチェックする全てパスした場合にのみ、リダイレクトするという最大3段階に及ぶ遷移を実現するのに、一つ一つを丁寧に記述したせいで少しコードが冗長化しているように見えます。他にいい書き方はないものかなあと探していたら、ここへたどり着きました。Nginx,DreamhostここのFeedBurnerの欄に書いてあったコードを引用します。last;最初に示したコードとほとんど一緒で、最終的にぼくはこのコードを流用しています。唯一異なるのは、引用では^/feed/となっているところを改変したコードでは^/feedとしているところです。違いに対応しています。方へアクセスがあった場合はどのようになっているか。wgetで実験してみました。アクセスした時に余計な手間が増えています。アクセスしたらどのようにリダイレクトされるのか確認してみましょう。wgetコマンドをスパイダーモードで試してみました。スパイダーモードが有効です。リモートファイルが存在してるか確認します。スパイダーモードが有効です。リモートファイルが存在してるか確認します。スパイダーモードが有効です。リモートファイルが存在してるか確認します。リモートファイルが存在します。飛ばされ、そのあと更にFeedBurnerにリダイレクトされています。/feed→/feed/への余計なリダイレクトが入るこの程度のリダイレクトは気にするほどの大きな遅延でもないのですが、こういうのが積もり積もっていくことでWebサイトはずっしりしていくので、注意していきたいです。}このリダイレクトルールを書いておけば、こちらは/feedにも/feed/にも対応していますので、どちらにアクセスされても一度の遷移だけで解決してくれます。小さなことでえらく長いエントリになってしまった...。コメントをキャンセルメールアドレスが公開されることはありません。コメント名前メールアドレスサイトスパム対策のため、コメントする際は下記の計算式を埋めてください。計算式の有効期限が切れました。計算式の隣にある再読み込みボタンを押してください。コメントデータの処理方法の詳細はこちらをご覧ください。このブログについてころすけと申します。関東でプログラマーをしています。JavaScriptあたりがお気に入り。当ブログでは私が作ったもの、考えたこと、撮影したものなど、全てをごった煮で書き綴るブログです。よろしければおつきあい下さいませ。プロフィールについて、詳しくはコチラへどうぞ。