2015-12-31 65 views
3

在我的生產服務器SSL/https安裝,我的Facebook 分享按鈕不顯示。nginx重寫導致Facebook的JavaScript不工作

相同的分享按鈕在我的測試服務器(僅限http)使用相同的代碼庫可見。

我認爲這是由於nginx的重定向造成從http所有流量到https設置,但我不能修復它

我的Facebook 份額按鈕的代碼庫

<div id="fb_share_id" class="fb-share-button" data-href="http://www.example.com/hi.html" data-type="button"></div> 

<script> 
window.fbAsyncInit = function() { 
FB.init({ 
    appId  : 'xxxxxxxxxxxx', 
    xfbml  : true, 
    version : 'v2.5' 
});  
}; 

(function(d, s, id){ 
var js, fjs = d.getElementsByTagName(s)[0]; 
if (d.getElementById(id)) {return;} 
js = d.createElement(s); js.id = id; 
js.src = "//connect.facebook.net/en_US/sdk.js"; 
fjs.parentNode.insertBefore(js, fjs); 
}(document, 'script', 'facebook-jssdk')); 

</script> 

和我nginx的重寫規則

upstream example_app_server { 
server unix:/webapps/example/run/gunicorn.sock fail_timeout=0; 
} 

server { 
listen 80; 

server_name example.com; 
return 301 https://$server_name$request_uri; 
} 

server { 
server_name www.example.com; 
return 301 $scheme://example.com$request_uri; 
} 

server { 


listen 443 default_server ssl; 
server_name example.com; 
server_name www.example.com; 
ssl on; 
. 
. 
} 
+3

有幾個思路:1)改變數據HREF鏈接也使用https 2)確保了Facebook SDK被加載(查看網絡選項卡的瀏覽器開發工具)3)在瀏覽器控制檯中查找錯誤,並在這裏發佈 – Martin

+0

99%,這與nginx無關,因爲它全部發生在JS和JS中直接轉到FB。正如上面提到的評論,檢查控制檯,看看是否有錯誤。例如 - 錯誤的Facebook應用程序ID;代碼中的其他地方發生JavaScript錯誤,導致頁面上的所有JS被破壞。 –

回答

0

如果您服務於www.example.comexample.com域名server_name指令它沒有意義,您執行www。非www。重定向,只是刪除這個重寫規則:

# This is NO NEEDED, as long as your server ALSO process www.example.com as server_name 
# server { 
# server_name www.example.com; 
# return 301 $scheme://example.com$request_uri; 
#} 

server { 


    listen 443 default_server ssl; 
    server_name example.com www.example.com; # PUT both domains into unique directive 
    requests arrives 
    ssl on; 
    . 
    . 
} 

否則,如果你真的想重定向所有WWW。 uris到非www。的URI則只是改變data-href="http://example.com/hi.html"你的HTML和改變server_name指令:

server { 


    listen 443 default_server ssl; 
    server_name example.com; 
    # server_name www.example.com; # This is NO NEEDED, only example.com requests arrives 
    ssl on; 
    . 
    . 
}