Short answer, you can't.
Once the object has been created on Facebook's side its URL in Facebook's graph is fixed - the Likes and Comments are associated with that URL and object; you need that URL to be accessible by Facebook's crawler in order to maintain that object in the future. (note that the object becoming inaccessible doesn't necessarily remove it from Facebook, but effectively you'd be starting over)
What I usually recommend here is (with examples http://www.example.com/oldurl
and http://www.example.com/newurl
):
- On /newpage, keep the og:url tag pointing to /oldurl
- Add a HTTP 301 redirect from /oldurl to /newurl
- Exempt the Facebook crawler from this redirect
- Continue to serve the meta tags for the page on
http://www.example.com/oldurl
if the request comes from the Facebook crawler.
- No need to return any actual content to the crawler, just a simple HTML page with the appropriate tags
Thus:
- Existing instances of the object on Facebook will, when clicked, bring users to the correct (new) page via your redirect
- The Like button on the (new) page will still produce a like of the correct object (but at the old URL)
If you're moving a lot of URLs around or completely rewriting your URL scheme you should use the new URLs for new articles/products/etc, but you'll need to keep the redirect in place if you want to retain likes, comments, etc on the older content.
This includes if you're changing domain.
The only problem here is maintaining the old URL -> new URL mapping somewhere in your code, but it's not technically difficult, just an additional thing to maintain in the future.
BTW, The Facebook crawler UA is currently facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)