常時SSL化といいね!

常時SSL化すると、それまでのFacebookいいね!のカウントが引き継がれなくなってしまいます。常時SSL化後の新規コンテンツについてはもちろんいいね!がカウントされますが、それ以前のコンテンツはゼロになってしまいます。気にしなければいいのかも知れませんが、せっかくいいね!をたくさんもらって、ブログ投稿の大きな励みになっている訳で、やはり復活させたいと思います。

  • 要は常時SSL化以前のコンテンツだけ、OGPメタタグのURLをhttpsからhttpに書き換える。
  • Facebookのクローラーに対してのみhttpからhttpsへリダイレクトしないようにする。

この2点です。(参考

参考ページはMovableTypeなのでこれをDrupal7に置換えます。

コンテンツ作成日で切り分ける方法もいいかと思いますが、NID(コンテンツ固有の連番)で切り分けるのが簡単かも。html.tpl.phpのheadタグにコードを追加します。

<?php if (arg(0) == 'node' && is_numeric(arg(1))): ?> 
<?php $nid = arg(1);  ?> 
<?php if ($nid < SSL化する前の最後のNID): 
print '<meta property="og:url" content="http://DOMAIN/PATH/'.$nid.'"/>';
else: 
print '<meta property="og:url" content="https://DOMAIN/PATH/'.$nid.'"/>'; 
endif; ?> 
<?php endif; ?>

1行目、2行目はNIDを取得するためのおまじないです。SSL化する前の最後のNIDの場合はog:urlにhttpで、それ以降はhttpsにします。

次に.htaccessに1行、下記の3行目を追加します。

# Various rewrite rules.
<ifmodule mod_rewrite.c>
  RewriteEngine on
  RewriteCond %{HTTP_USER_AGENT} !(Facebot|facebookexternalhit/1.1) [NC] 
  RewriteCond %{HTTPS} off
  RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

3行目以外はhttpからhttpsにリダイレクトさせる設定です。3行目でFacebookのクローラーだけはリダイレクトさせないように設定します。SSL化以降はリダイレクトさせる必要がないので、Facebookのクローラーはhttpsを読んでくれます。

たぶん何日かするとFacebookのクローラーが回って来てくれて、いいね!カウントは反映されるはずですが、すぐに反映させたい場合はFacebookのシェアデバッガーで「新しい情報を取得」すればいいね!カウントが出てきます。

追記11/23: クローラーは更新してくれないようで、シェアデバッガーで1件ずつ新しい情報を取得するしかないようです。