FB PHP SDK和mod_rewrite:getUser返回0

时间:2012-07-05 15:11:55

标签: mod-rewrite facebook-php-sdk

我正在使用Facebook PHP SDK,以允许用户使用Facebook登录我的网站 在我的测试中(假设网址为http://mysite.com/test/fbtest.php),

<?php
    require_once("facebook.php");
    $fb = new Facebook(array('appId' => 'APP_ID', 'secret' => 'APP_SECRET'));
    $fbuser = false;
    $fbuserid = $fb->getUser();
    $fblogin = $fb->getLoginUrl(array(
        'redirect_uri' => "http://{$_SERVER['HTTP_HOST']}/test/fbtest.php"));

if($fbuserid)
{
    try
    {
        $fbuser = $fb->api("/me");
        print_r($fbuser);
        echo "<br/>\n";
    }
    catch (FacebookApiException $e)
    {
        $fbuser = false;
        $fbuserid = 0;
    }
}
if(!$fbuser)
    echo "<a href=\"$fblogin\">FB Login</a>\n";
?>

这似乎按预期工作。但是,当我添加以下重写规则时,

RewriteRule ^/FBtest/(.*)$ http://%{HTTP_HOST}/test/fbtest.php$1

然后将我的登录重定向更改为以下内容,

$fblogin = $fb->getLoginUrl(array(
        'redirect_uri' => "http://{$_SERVER['HTTP_HOST']}/FBtest/"));

然后$fb->getUser()总是返回0.我觉得我错过了一些重要的东西。

3 个答案:

答案 0 :(得分:1)

在服务器端流程中,使用必要的值调用redirect_uri get作为查询字符串中的GET参数。

  

'redirect_uri' => "http://{$_SERVER['HTTP_HOST']}/FBtest/"

所以使用这个redirect_uri,比如

http://example.com/FBtest/?state=foo&code=bar

将在您的服务器上调用。

  

RewriteRule ^/FBtest/(.*)$ http://%{HTTP_HOST}/test/fbtest.php$1

RewriteRules不检查查询字符串,它们只查看URL的路径组件。在你的情况下,那是/FBtest/,没有任何内容 - 所以内部重定向转到/test/fbtest.php,查询字符串参数丢失,因为你没有说你想传递它们。

将标记[QSA] - 用于“查询字符串追加” - 添加到您的RewriteRule(并删除不必要的(.*)) - 然后事情应该按预期工作,因为您的fbtest.php将获得查询身份验证过程所需的字符串参数。

答案 1 :(得分:1)

最后想出了这个问题。这是我需要的RewriteRule:

RewriteRule ^/FBtest/$ http://%{HTTP_HOST}/test/fbtest.php [QSA,NE]

事实证明我需要在此规则中添加QSA和NE标志。

就像在CBroe的回答中一样,添加到redirect_uri的状态/代码参数需要QSA标志(在RewriteRule中使用(.*)而不是捕获这些附加参数)。

我还需要添加NE标记,因为Facebook身份验证添加到redirect_uri的状态/代码正在被转义。

答案 2 :(得分:0)

您将无法使用您在应用程序设置中设置的域以外的任何其他域。

“请确保您使用的是根域,而不是使用sample.com/test/作为您的网址设置。”