かなり前に作ったサービスなんですが、入れたはずのデータが時間が経つと消えているという怪現象に遭遇しました。
いや、分かってみると怪現象でもなんでもなかったんですが、とある中華検索サイトが削除リンクをクローラ収集中に踏んでいたのでした。
こういうことが起きないよう、クローラにアクセスされるとデータが変わってしまうようなリンクはPOSTかJavaScriptを使ったリンクにしましょう。
元のリンク
1 2 3 4 5 |
<?php echo $ajax->link( '削除', '/hoge/delete/'.$id, array('update'=>'word_add') ); ?> |
cakePHP1.3のajaxヘルパー(2.0では非推奨)を使ってリンク先の画面を画面を遷移せずに取得していました。変換されるHTMLをみると
1 2 3 4 5 6 |
<a href="/hoge/delete/1" id="link63926877" onclick=" event.returnValue = false; return false;">削除</a> <script type="text/javascript"> //<![CDATA[ Event.observe('link63926877', 'click', function(event) { new Ajax.Updater('word_add','/hoge/delete/1', {asynchronous:true, evalScripts:true, requestHeaders:['X-Update', 'word_add']}) }, false); //]]> </script> |
とJavaScriptが実行できないクローラでも普通のリンクとして辿れるようにできています。
POSTに書き換えました。(div内を書き換えるのでなく特定のdivを削除するようやり方は変わってます)
jQueryを使用しています。
1 2 3 4 5 6 7 8 9 10 11 |
<?php $uid = uniqid(); // ユニークID ?> <div id="hoge<?php echo $uid ?>"> [<a href="#" onClick=" if (confirm('本当に削除してよろしいですか?')) { $.post('/hoge/delete',{id:<?php echo $id ?>}, function(){ $('#word<?php echo $uid ?>').hide(); }); } return false; ">削除</a>] </div> |
ちなみにcakePHP2.0のFormヘルパーにはpostLINKという関数が追加されていますので、動的に書き換えたりしないならこっちを使ったほうが簡単なのではないでしょうか。
キャッシュ可能なURLはGETで、データ操作のあるURLはPOSTで行うと考えると分かりやすいでしょう。
しかし検索クローラはPOSTをSUBMITしないのでしょうか。googleは2012年のWEBマスター向け公式ブログでPOSTリクエストに対応していると明記しています。
いずれまた対策を施さないといけなくなるかもしれません。その時は、パーミッションの与えられた会員ユーザーかどうかをチェックしたうえで削除することになるでしょう。