为什么Facebook抓取我的php服务器端脚本与其他OG验证程序不同?

为什么Facebook抓取我的php服务器端脚本与其他OG验证程序不同?,php,facebook-opengraph,Php,Facebook Opengraph,首先,我是PHP新手,这是我第一个动态提供og标记的脚本 Facebook OG调试页面似乎以某种方式获得了实际的php脚本,我认为这是不可能的。我目前对服务器端脚本的理解是,服务器应该只执行它们,而不显示它们? 看起来Facebook正在抓取我的php的初始化代码,而不是它的最终执行。除非我对php变量作用域的理解有偏差??我完全困惑不解 这是我的php逻辑。我将php变量$ogTitle和$ogImage初始化为一些默认字符串,然后根据php从url上指定的xml/媒体中刮取的内容继续更新相

首先,我是PHP新手,这是我第一个动态提供og标记的脚本

Facebook OG调试页面似乎以某种方式获得了实际的php脚本,我认为这是不可能的。我目前对服务器端脚本的理解是,服务器应该只执行它们,而不显示它们?
看起来Facebook正在抓取我的php的初始化代码,而不是它的最终执行。除非我对php变量作用域的理解有偏差??我完全困惑不解

这是我的php逻辑。我将php变量$ogTitle和$ogImage初始化为一些默认字符串,然后根据php从url上指定的xml/媒体中刮取的内容继续更新相同的变量

这是我的PHP

<?php
// Set the defaults...
$ogTitle=".Universal Media Thru Internet." ;
// the following inserted for debug to prove facebook is grabbing this value ??? instead of the final derived one.
$ogTitle="الباء WRONG TITLE MEANT TO BE THE DEFAULT IF PHP DOES NOT DYNAMICALLY DERIVE ONE" ;
$ogDescription="Mumti the Next Generation" ;
$ogUrl = "http://mumti.org" ;
// 20180413
if ($_GET['ms'] != '') {
    $url = $_GET['ms'];
}
if ($_GET['mq'] != '') {
    $url = $_GET['mq'];
}
if ($url != '') {
    $xml=simplexml_load_file($url) or die("Error: Cannot access XML $url");

//
    $Pic = $xml->SLIDE[0]->PIC;
    $rcbmp_root = $xml->rcbmp_root;
// -) derive final path for image
    if ($rcbmp_root == "")
        $ogImage = dirname($url) . "/" . $Pic ;
    else
        $ogImage = dirname($url) . "/" . $rcbmp_root . $Pic ;
//
    $ogTitle = $xml->SLIDE[0]->TXT;


    // Cleanup the ogImage URL (aka path normalization)
    $u = parse_url(strtolower($ogImage)); // returns the URL components in associative-array
    $u['path'] = simplify($u['path']); // removes the .. notations from the path component
    $ogImage = "{$u['scheme']}://{$u['host']}{$u['path']}"; // piece the components together into a URL
}

?>
它显示正确的og:title和有效的og:image,如下所示:

<meta lang="ar" property="og:title" content="البَاءُ" />
<meta property="og:image" content="http://arabicrescue.com/ar/arabic/letters.bmp/400_1/02.png">

然而,使用完全相同的URL,Facebook调试页面坚持认为有问题

Facebook似乎从“if($url!=''){…”评估中获取了我的php脚本的初始化值,而没有任何内容

谢谢你对这件事的解释,因为我没能向facebook bug报告解释我自己(

Facebook的修复方案是提供og:url作为实际url,而不仅仅是网站的根url。否则,它会将og:title显示为null(即“”),并将og:image和一些较旧的图像(我的网站徽标)显示为爬虫机器人不久前抓取的图像。这是我无法真正理解和解释的

不管怎样,使用下面的附加php代码,facebook将正确返回标题和图像

<meta lang="ar" property="og:title" content="البَاءُ" />
<meta property="og:image" content="http://arabicrescue.com/ar/arabic/letters.bmp/400_1/02.png">
$ogImage = str_replace( " ", "%20", $ogImage );
// -) provide canonical url
// https://stackoverflow.com/questions/6768793/get-the-full-url-in-php
$actual_link = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
$ogUrl = str_replace( " ", "%20", strtolower($actual_link) );