サーバー

nginxでFeedBurnerのクローラーだけ受け入れる方法

つい先日、このブログ(WordPress)をようやくApache無し、nginxだけで動かすことに成功しました。わーい。ところが今日、ふと変なことに気づいた。RSSが更新されていない・・・。

このブログのRSSはFeedBurnerに流していました。なので、一般の方がRSSを見た場合はFeedBurnerを見に行くようにしていたんです。

今回Apacheからnginxにリプレースした際も、RSSを見に来た人をFeedBurnerにリダイレクトさせる(飛ばす)ようにしました。

・・・が。
これじゃFeedBurnerさんは更新情報を取れないですな。クローラーもFeedBurnerに飛ばされちゃうんだものw

というわけで本題。今回は下記のように設定します。

  • 一般ユーザーがWordPressのRSS( http://zafiel.wingall.com/feed )を見た場合はFeedBurnerに移動するようにします。
  • FeedBurnerのクローラーだけはRSSを読めるようにします。

やることは簡単。訪問者のユーザーエージェントを見て識別します。
FeedBurnerのユーザーエージェントは「FeedBurner/1.0」らしい。なので、プロキシのserver部分に判別処理を書きます。

[/crayon]

こんな感じ。参考にどうぞ(・∀・)!

Facebook / 広告
2012年05月09日 | Posted in サーバー1 Comment » 

関連記事

コメント1件

  • […] NGINXで運営するWordpressのRSSにFeedBurnerを適応する際のRewriteルールの書き方 | CaCi – Takahiro's Kitchenvar _gaq=_gaq||[];_gaq.push(["_setAccount","UA-18235043-3"]);_gaq.push(["_trackPageview"]);(function(){var a=document.createElement("script");a.type="text/javascript";a.async=true;a.src=("https:"==document.location.protocol?"https://ssl":"http://www")+".google-analytics.com/ga.js";var b=document.getElementsByTagName("script")[0];b.parentNode.insertBefore(a,b)})()Takahiro's KitchenFeedsCaCiNGINXで運営するWordPressのRSSにFeedBurnerを適応する際のRewriteルールの書き方NGINXは素晴らしいNGINX + WordPress + FeedBurnerの利用には、リダイレクトルールをRewriteする方法がオススメです。Primary FeedburnerのようなプラグインはApacheでの動作を前提としておりますので、NGINXではリダイレクトルールがうまく働きません。プラグインは一見便利そうに見えて、サーバとの連携が上手くいかないと途端にポンコツ化するので注意が必要です。Apacheならいいんでしょうね、Apacheなら…。さて、件の実現を結論から書くと、RewriteルールをNGINX設定ファイルのserverブロックに記述します。次のとおりです。if ($http_user_agent !~ FeedBurner) { rewrite ^/comment/feed http://feeds.feedburner.com/your.commentfeed.name last; rewrite ^/feed http://feeds.feedburner.com/your.feed.name last; }※リバースプロキシを使用している場合は、フロントエンド(80番ポート)のserverブロックの方に記述します。これによってFeedBurnerエージェントのアクセス以外は、キチンとブログフィードをFeedBurnerへリダイレクトするようになります。ここから先は本記述に至るまでのプロセスメモになります。google_ad_client="ca-pub-4155246445920766";google_ad_slot="2673826910";google_ad_width=468;google_ad_height=60;Primary FeedburnerがNGINXで使えない?!初めはPrimary Feedburnerプラグインを使用していました。いちおうブログに見えているフィードアイコンはきちんとFeedBurnerアドレスを示していたので気づかなかったのですが、ふとサーバの方を見ると、Wordpressの.htaccessにこんな記述がありました。Primary Feedburnerはブログフィードのリンク先をFeedBurnerへと置換するプラグインです。しかし、クローラ等が/feed/などへ直接アクセスする際には.htaccessのリダイレクトルールで対応していたようでした。ところがNGINXでは.htaccessは使えません。Apacheなら問題ないのですが、NGINXをWebサーバとして使用する以上、.htaccessではなくNGINXの設定ファイルの方でRewriteを記述していくしかありません。そしてNGINXの設定ファイルに直接書き込む以上、プラグインって必要ないよね…ということでぼくはPrimary Feedburnerと別れを告げました。locationブロックで対応するネットで調べたところ、NGINX + WordPress + FeedBurnerという組み合わせで運営する方法では以下のブログがまず見つかりました。nginxでFeedBurnerのクローラーだけ受け入れる方法,Azrael件のコード部分を引用します。locationブロックを使った対応です。この構成の意図を著者の言葉で表すと、一般ユーザーがWordPressのRSS( http://zafiel.wingall.com/feed )を見た場合はFeedBurnerに移動するようにします。FeedBurnerのクローラーだけはRSSを読めるようにします。ということだそうです。その意図を実現する上記のコードについて、紐解いていきましょう。まず次に示す、最も外側のスコープです。location /feed {     … }これは「feedで始まるアドレスへのアクセスがあった場合」という条件分岐になります。RSSフィードへアクセスがあれば、このlocationブロックが対応します。次です。if ($http_user_agent ~ ^FeedBurner) { proxy_pass http://127.0.0.1:8000/; break; }これは「アクセスしてきたユーザエージェントがFeedBurnerであった場合」という条件分岐になります。FeedBurnerのクローラがアクセスしてきたら、リバースプロキシに直接通してあげよう、つまり勝手にリダイレクトせずにブログを直接見せてあげようというルールになります。これによってFeedBurnerのクローラだけはRSSが読めるようになります。次です。rewrite ^(.*) http://feeds.feedburner.com/azrael last; break;これは先ほどの条件分岐の先にあるので、「FeedBurner以外のアクセスだった場合」に、「feedへのアクセスをFeedBurnerへリダイレクトする」というルールになります。これで確かにブログフィードへのアクセスがあった場合に、FeedBurnerクローラとそれ以外とを分け、適切にリダイレクトするルールが完成しています。Serverブロックで対応する先ほどのlocationブロックの記述でも十分対応できるのですが、コードがやや長めです。というのも、アクセス先(feedかどうか)をチェックするユーザエージェントをチェックする全てパスした場合にのみ、リダイレクトするという最大3段階に及ぶ遷移を実現するのに、一つ一つを丁寧に記述したせいで少しコードが冗長化しているように見えます。他にいい書き方はないものかなあと探していたら、ここへたどり着きました。Nginx,DreamhostここのFeedBurnerの欄に書いてあったコードを引用します。rewrite ^/comment/feed/ http://feeds.feedburner.com/your-comment-feed last; rewrite ^/feed/ http://feeds.feedburner.com/your-feed last;最初に示したコードとほとんど一緒で、最終的にぼくはこのコードを流用しています。唯一異なるのは、引用では^/feed/となっているところを改変したコードでは^/feedとしているところです。この違いは、/feed/ と /feed の違いに対応しています。どういうことか。実際、/feed の方へアクセスがあった場合はどのようになっているか。wgetで実験してみました。無駄なリダイレクトは減らしたいDreamhoshにあったリダイレクトの記述は /feed/ に対応していましたが、/feed には対応していません。別にそれでも問題ないのですが、実はこの設定では /feed にアクセスした時に余計な手間が増えています。実験的に、Dreamhostの設定で /feed にアクセスしたらどのようにリダイレクトされるのか確認してみましょう。wgetコマンドをスパイダーモードで試してみました。$ wget -S –spider http://blog.hifumi.info/feed スパイダーモードが有効です。リモートファイルが存在してるか確認します。 –2012-07-15 17:55:04– http://blog.hifumi.info/feed blog.hifumi.info (blog.hifumi.info) をDNSに問いあわせています… 219.94.241.187 blog.hifumi.info (blog.hifumi.info)|219.94.241.187|:80 に接続しています… 接続しました。 HTTP による接続要求を送信しました、応答を待っています… HTTP/1.1 301 Moved Permanently Server: nginx Date: Sun, 15 Jul 2012 08:55:04 GMT Content-Type: text/html; charset=UTF-8 Connection: keep-alive X-Pingback: http://blog.hifumi.info/xmlrpc.php ETag: "bf4b77627d3be17f62b4b811c8c743b2" X-NGINX-CACHED: YES – 600 secs X-NGINX-CACHED-AT: 2012-07-15T08:55:04+00:00 Location: http://blog.hifumi.info/feed/ 場所: http://blog.hifumi.info/feed/ [続く] スパイダーモードが有効です。リモートファイルが存在してるか確認します。 –2012-07-15 17:55:04– http://blog.hifumi.info/feed/ blog.hifumi.info (blog.hifumi.info)|219.94.241.187|:80 に接続しています… 接続しました。 HTTP による接続要求を送信しました、応答を待っています… HTTP/1.1 302 Moved Temporarily Server: nginx Date: Sun, 15 Jul 2012 08:55:04 GMT Content-Type: text/html Connection: keep-alive Location: http://feeds.feedburner.com/Caci 場所: http://feeds.feedburner.com/Caci [続く] スパイダーモードが有効です。リモートファイルが存在してるか確認します。 –2012-07-15 17:55:04– http://feeds.feedburner.com/Caci feeds.feedburner.com (feeds.feedburner.com) をDNSに問いあわせています… 173.194.38.3, 173.194.38.4, 173.194.38.5, … feeds.feedburner.com (feeds.feedburner.com)|173.194.38.3|:80 に接続しています… 接続しました。 HTTP による接続要求を送信しました、応答を待っています… HTTP/1.1 200 OK Content-Type: text/xml; charset=UTF-8 ETag: iLzDGMo1+49IMbwMkpBWEwEAKS4 Last-Modified: Sun, 15 Jul 2012 08:51:04 GMT Date: Sun, 15 Jul 2012 08:55:04 GMT Expires: Sun, 15 Jul 2012 08:55:04 GMT Cache-Control: private, max-age=0 X-Content-Type-Options: nosniff X-XSS-Protection: 1; mode=block Server: GSE Transfer-Encoding: chunked 長さ: 特定できません [text language=”/xml”][/text] リモートファイルが存在します。この通り、/feed にアクセスすると、一度 /feed/ に飛ばされ、そのあと更にFeedBurnerにリダイレクトされています。/feed→/feed/への余計なリダイレクトが入るこの程度のリダイレクトは気にするほどの大きな遅延でもないのですが、こういうのが積もり積もっていくことでWebサイトはずっしりしていくので、注意していきたいです。で、結局一番初めに戻って、if ($http_user_agent !~ FeedBurner) { rewrite ^/comment/feed http://feeds.feedburner.com/your.commentfeed.name last; rewrite ^/feed http://feeds.feedburner.com/your.feed.name last; }このリダイレクトルールを書いておけば、こちらは/feedにも/feed/にも対応していますので、どちらにアクセスされても一度の遷移だけで解決してくれます。たかだか小さなことでえらく長いエントリになってしまった…。ハイパフォーマンスHTTPサーバ Nginx入門※画像をクリックするとAmazonのページへ移動しますvar entity_decoded_nr_mp_url=jQuery('').html("http://api.nrelate.com/mpw_wp/0.51.2/loadcounter.php?tag=nrelate_popular&domain=blog.hifumi.info&url=http%3A%2F%2Fblog.hifumi.info%2Fdev%2Fhow-to-write-redirect-rule-in-nginx-with-wordpress-and-feedburner%2F").text();nRelate.getNrelatePosts(entity_decoded_nr_mp_url);             ツイート!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");        (function(a,b,c){var d,e=a.getElementsByTagName(b)[0];if(a.getElementById(c))return;d=a.createElement(b);d.id=c;d.src="//connect.facebook.net/ja_JP/all.js#xfbml=1&appId=259377790762956";e.parentNode.insertBefore(d,e)})(document,"script","facebook-jssdk")        window.___gcfg={lang:"ja"};(function(){var a=document.createElement("script");a.type="text/javascript";a.async=true;a.src="https://apis.google.com/js/plusone.js";var b=document.getElementsByTagName("script")[0];b.parentNode.insertBefore(a,b)})()            nRelate.domain="blog.hifumi.info";var entity_decoded_nr_mp_url=jQuery('').html("http://api.nrelate.com/mpw_wp/0.51.2/?tag=nrelate_popular&domain=blog.hifumi.info&url=http%3A%2F%2Fblog.hifumi.info%2Fdev%2Fhow-to-write-redirect-rule-in-nginx-with-wordpress-and-feedburner%2F&nr_div_number=2&maxageposts=2102400&increment=1").text();nRelate.getNrelatePosts(entity_decoded_nr_mp_url);var entity_decoded_nr_url=jQuery('').html("http://api.nrelate.com/rcw_wp/0.51.2/?tag=nrelate_related&keywords=NGINX%E3%81%A7%E9%81%8B%E5%96%B6%E3%81%99%E3%82%8BWordPress%E3%81%AERSS%E3%81%ABFeedBurner%E3%82%92%E9%81%A9%E5%BF%9C%E3%81%99%E3%82%8B%E9%9A%9B%E3%81%AERewrite%E3%83%AB%E3%83%BC%E3%83%AB%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9&domain=blog.hifumi.info&url=http%3A%2F%2Fblog.hifumi.info%2Fdev%2Fhow-to-write-redirect-rule-in-nginx-with-wordpress-and-feedburner%2F&nr_div_number=1").text();nRelate.getNrelatePosts(entity_decoded_nr_url);← FreeBSDでPassenger+NGINXなRails環境を構築するvimの設定ファイル(.vimrc)を晒してみる →まとめFreeBSD 9のエトセトラMacintoshアソビWordPressに入れているプラグイン一覧PrivateFacebookPhoto Blogおくむらログ友人いつものblues凡人プログラマーの独り言カテゴリーDevMacNotificationReviewNon-classifiedJust MemoJust TweetingTag CloudBloggerCameraCentOSExtensionsfoodFreeBSDGitGoogle ChromeHomebrewiPhotoLamyLinuxMacMacBook Pro RetinaMemoNginxpangoPenPixelmatorPluginpngRubyRuby on RailsSafariServersshsvgvimWordpressXcodeZshさくらVPSアプリ梅酒梅酒作り自家製梅酒CaCi is prowdly powered by WordPress. · © 2008 · All rights reserved.Doc theme by Theme Museum. […]

  • コメントを残す

    メールアドレスが公開されることはありません。

    スパム対策のため、コメントする際は下記の計算式を埋めてください。 計算式の有効期限が切れました。計算式の隣にある再読み込みボタンを押してください。