php – Facebook有时不会获取Open Graph标签

前端之家收集整理的这篇文章主要介绍了php – Facebook有时不会获取Open Graph标签前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个公共图书馆的iOS应用程序,分享到Facebook的链接.链接指向单个域,其中包含一个相对简单的 PHP脚本,该脚本根据链接内容(目录项,日历事件和用户生成的列表)重定向到三个不同的目标域.我已经设置好了,因为我使用iOS通用链接,我没有控制所有的链接目的地,所以我需要一个中心位置的苹果应用程序网站关联文件.

在这个PHP脚本中,我试图根据共享内容的类型动态设置OG标签.这是脚本:

  1. <?PHP
  2.  
  3. $shareType = $_GET['t'];
  4. $contentId = $_GET['id'];
  5.  
  6. $base_catalog_url='XXXXXXXXXXXX';
  7. $base_list_url='XXXXXXXXXXXXX';
  8. $base_event_url='XXXXXXXXXXXXXX';
  9.  
  10. if($shareType=='0'){
  11. $oclc;
  12. if(strlen($contentId)==8){
  13. $oclc = 'ocm'.$contentId;
  14. }
  15.  
  16. if(strlen($contentId)==9){
  17. $oclc = 'ocn'.$contentId;
  18. }
  19.  
  20. $url = $base_catalog_url.'searchCatalog?'.http_build_query(array('clientID' =>'sdIPhoneApp','term1'=>$oclc));
  21. $resp = simplexml_load_file($url);
  22.  
  23. $pageTitle = $resp->HitlistTitleInfo->title;
  24. $isbn = $resp->HitlistTitleInfo->ISBN;
  25. $imageURL = 'http://www.syndetics.com/index.aspx?isbn='.$isbn.'/lc.gif&client=XXXXXXX';
  26. $redirectURL = 'XXXXXXXXXXXX'.$contentId;
  27. error_log($redirectURL);
  28. echo '<html>
  29. <head>
  30. <Meta property="og:image" content="'.$imageURL.'" />
  31. <Meta property="og:title" content="'.$pageTitle.'" />
  32. <Meta name="twitter:card" content="summary" />
  33. <Meta name="twitter:site" content="@acpl" />
  34. <Meta name="twitter:title" content="'.$pageTitle.'" />
  35. <Meta name="twitter:description" content="Allen County Public Library" />
  36. <Meta name="twitter:image" content="'.$imageURL.'" />
  37. <Meta http-equiv="refresh" content="0;URL='.$redirectURL.'">
  38. </head>
  39. </html>';
  40. }
  41.  
  42. if($shareType=='1'){
  43. $url = $base_event_url.http_build_query(array('eventid' =>$contentId));
  44. $response = file_get_contents($url);
  45. $json = json_decode($response);
  46. $event = $json[0];
  47. $imageURL = $event->Image;
  48. $pageTitle = $event->Title;
  49. $description = $event->Description;
  50.  
  51. if(strlen($imageURL)<5){
  52. $imageURL = 'https://XXXXXXXXX/appIcon200.png';
  53. }
  54.  
  55. $redirectURL = 'XXXXXXXXXXX'.$contentId;
  56.  
  57. echo '<html>
  58. <head>
  59. <Meta property="og:image" content="'.$imageURL.'" />
  60. <Meta property="og:title" content="'.$pageTitle.'" />
  61. <Meta property="og:description" content="'.$description.'" />
  62. <Meta name="twitter:card" content="summary" />
  63. <Meta name="twitter:site" content="@acpl" />
  64. <Meta name="twitter:title" content="'.$pageTitle.'" />
  65. <Meta name="twitter:description" content="'.$description.'" />
  66. <Meta name="twitter:text:description" content="'.$description.'" />
  67. <Meta name="twitter:image" content="'.$imageURL.'" />
  68. <Meta http-equiv="refresh" content="0;URL='.$redirectURL.'">
  69. </head>
  70. </html>';
  71.  
  72. }
  73.  
  74. if($shareType=='2'){
  75.  
  76. $url = $base_list_url.http_build_query(array('listId' =>$contentId,'userKey'=>0));
  77. $response = file_get_contents($url);
  78. $json = json_decode($response);
  79. $imageURL = $json->coverImageURL;
  80. $pageTitle = $json->listName;
  81. $pageTitle = ucwords(strtolower($pageTitle));
  82.  
  83. $redirectURL = "XXXXXXXXXXXX";
  84.  
  85. echo '<html>
  86. <head>
  87. <Meta property="og:image" content="'.$imageURL.'" />
  88. <Meta property="og:title" content="'.$pageTitle.'" />
  89. <Meta name="twitter:card" content="summary" />
  90. <Meta name="twitter:site" content="@acpl" />
  91. <Meta name="twitter:title" content="'.$pageTitle.'" />
  92. <Meta name="twitter:description" content="Allen County Public Library" />
  93. <Meta name="twitter:image" content="'.$imageURL.'" />
  94. <Meta http-equiv="refresh" content="0;URL='.$redirectURL.'">
  95. </head>
  96. </html>';
  97.  
  98. }
  99.  
  100. ?>

因此,根据共享的内容类型,我获取一个页面标题和图像以提供OG标签.重定向始终有效,无论Facebook是否插入标签,但标签只用了大约一半的时间.您可以在iOS应用中看到这一点.标签拉成功:

标签未拉入:

标签是否显示给定项目似乎是随机的.在我的服务器上的访问日志中,当标签成功显示时,我看到这样一行:

  1. 66.220.158.119 - - [09/Sep/2016:09:54:50 -0400] "GET /share.PHP?t=1&id=76137 HTTP/1.1" 206 3771 "-" "facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.PHP)"

但是,当标签显示时,访问日志或错误日志中没有任何内容.这表明Facebook(或iOS中的Facebook组件)在这些情况下甚至没有尝试读取标签.这是否意味着Facebook错误地认为该数据已被缓存?

另一个有趣的事情是当我尝试在Facebook共享调试器(https://developers.facebook.com/tools/debug/)上调试其中一个失败的URL时会发生什么.我会收到一条错误消息:

  1. The 'og:image' property should be explicitly provided,even if a value can be inferred from other tags.

当我点击“查看我们的刮刀看到你的URL”.我得到的答复“该文档没有返回任何数据”.

有趣的是,当我点击“再次刮擦”时,通常会在前几次给出相同的错误,然后在3或4次尝试后突然显示显示标签.我的第一个想法是,这与我如何动态地获取标签内容有关,但正如我上面指出的,在标签显示的情况下,访问日志显示Facebook甚至不是从我的服务器请求任何东西.

谢谢你的帮助;这让我把我的头发拉出来!

更新:如果您希望在Facebook调试器中尝试,请尝试以下示例URL:https://amshare.acpl.lib.in.us/0_930144011

下划线后的数字是本书的OCLC编号,因此您可以在其中插入其他值.正如我提到的,经过几次刮擦,它通常开始工作,然后再次无法再工作.

我可以将Facebook缓存share.PHP文件并忽略GET Vars.

您可以尝试将URL重写为“漂亮的永久链接”.把它放在你的htaccess文件(如果你有apache):

  1. Options +FollowSymLinks
  2. RewriteEngine On
  3.  
  4. RewriteRule ^share/(.*)/(.*)$share.PHP?t=$1&id=$2 [L,NC]

这使得http://your-url.com/share/4/yeah这样做:http://your-url.com/?t=4\u0026amp;id=yeah

$_GET var看起来像这样:

  1. Array ( [t] => 4 [id] => yeah )

有了这个,你可以解决这个问题(如果它是真正的缓存).过去我在facebook刮板上遇到了很多问题.有时它会忽略get vars,它像地狱一样缓存

猜你在找的PHP相关文章