Facebook回调附加'#

Facebook回调已开始将#_=_哈希下划线附加到返回URL

有谁知道为什么? 解决办法是什么?


通过Facebook的平台更新:

会话重定向行为的改变

本周,当这个字段留空时,我们开始向redirect_uri添加一个片段#____ = ____。 请确保您的应用可以处理这种行为。

为了防止这种情况,请在您的登录url请求中设置redirect_uri,如下所示:(使用Facebook php-sdk)

$facebook->getLoginUrl(array('redirect_uri' => $_SERVER['SCRIPT_URI'],'scope' => 'user_about_me'));

UPDATE

以上内容正如文件中所说的解决此问题一样。 但是,Facebook记录的解决方案不起作用。 请考虑在Facebook平台更新博客文章留言,并按照此错误获得更好的答案。 在此之前,将以下内容添加到您的head标签中以解决此问题:

<script type="text/javascript">
    if (window.location.hash && window.location.hash == '#_=_') {
        window.location.hash = '';
    }
</script>

或者更详细的选择(谢谢niftylettuce):

<script type="text/javascript">
    if (window.location.hash && window.location.hash == '#_=_') {
        if (window.history && history.pushState) {
            window.history.pushState("", document.title, window.location.pathname);
        } else {
            // Prevent scrolling by storing the page's current scroll offset
            var scroll = {
                top: document.body.scrollTop,
                left: document.body.scrollLeft
            };
            window.location.hash = '';
            // Restore the scroll offset, should be flicker free
            document.body.scrollTop = scroll.top;
            document.body.scrollLeft = scroll.left;
        }
    }
</script>

TL; DR

if (window.location.hash == '#_=_'){
    history.replaceState 
        ? history.replaceState(null, null, window.location.href.split('#')[0])
        : window.location.hash = '';
}

完整版与分步说明

// Test for the ugliness.
if (window.location.hash == '#_=_'){

    // Check if the browser supports history.replaceState.
    if (history.replaceState) {

        // Keep the exact URL up to the hash.
        var cleanHref = window.location.href.split('#')[0];

        // Replace the URL in the address bar without messing with the back button.
        history.replaceState(null, null, cleanHref);

    } else {

        // Well, you're on an old browser, we can get rid of the _=_ but not the #.
        window.location.hash = '';

    }

}

一步步:

  • 如果fragment#_=_我们只会进入代码块。
  • 检查浏览器是否支持HTML5 window.replaceState方法。
  • 通过分开#清理URL并只取第一部分。
  • 告诉history用干净的URL替换当前页面状态。 这会修改当前的历史记录,而不是创建新的历史记录。 这意味着后退和前进按钮将以您想要的方式工作。 ;-)
  • 如果浏览器不支持令人敬畏的HTML 5历史记录方法,那么只要将散列设置为空字符串,就可以尽可能地清理URL。 这是一个糟糕的回退,因为它仍然留下尾随散列(example.com/#),并且它还添加了历史记录条目,所以后退按钮会将您带回#_-_
  • 了解关于history.replaceState更多信息。

    了解更多关于window.location


    如果你想从网址中删除剩余的“#”

    $(window).on('load', function(e){
      if (window.location.hash == '#_=_') {
        window.location.hash = ''; // for older browsers, leaves a # behind
        history.pushState('', document.title, window.location.pathname); // nice and clean
        e.preventDefault(); // no page reload
      }
    })
    
    链接地址: http://www.djcxy.com/p/70351.html

    上一篇: Facebook Callback appends '#

    下一篇: How does Facebook Sharer select Images and other metadata when sharing my URL?