400 错误请求请求 Header 或 Cookie 太大 - Rails 与 facebook 和子域
400 Bad Request Request Header Or Cookie Too Large - Rails with facebook and subdomains
我在 rails 4 中使用子域创建了应用程序。它使用 Turbolinks。我给它添加了一个 facebook 插件。在生产中,当我刷新页面时,一切正常。但是,当我进入使用子域的 link 时,服务器响应 400 状态代码。
400 错误请求
请求 Header 或 Cookie 太大
nginx/1.6.2
如您所见,我使用 nginx 作为网络服务器。
我尝试调试它并注意到,在我的子域 facebook 插件上生成了两个额外的 cookie。
当我删除那些 cookie 时,我可以在我的子域上自由冲浪,直到我返回根域。之后,当我再次尝试访问我的子域时,这两个 cookie 再次生成,整个问题再次出现。
有谁知道为什么要创建它以及如何防止 facebook 生成它?
它没有出现在本地主机上。请问这是不是nginx的配置?
我当前的 FB 集成是使用 coffescript 提供的。
fb_root = null
fb_events_bound = false
fb_init = ->
loadFacebookSDK()
bindFacebookEvents() unless fb_events_bound
bindFacebookEvents = ->
$(document)
.on('page:fetch', saveFacebookRoot)
.on('page:change', restoreFacebookRoot)
.on('page:load', ->
FB?.XFBML.parse()
)
fb_events_bound = true
saveFacebookRoot = ->
fb_root = $('#fb-root').detach()
restoreFacebookRoot = ->
if $('#fb-root').length > 0
$('#fb-root').replaceWith fb_root
else
$('body').append fb_root
loadFacebookSDK = ->
window.fbAsyncInit = initializeFacebookSDK
$.getScript("//connect.facebook.net/pl_PL/all.js#xfbml=1")
initializeFacebookSDK = ->
FB.init
appId : 'my_app_id'
channelUrl: '//https://facebook.com/my_site
status : true
cookie : true
xfbml : true
@Facebook = { fb_init }
$(document).on "ready page:load pageshow", ->
Facebook.fb_init()
coffee_script 代码有问题。
我从https://developers.facebook.com/docs/plugins/like-button
复制代码解决了这个问题
到正文标签后的 html 文件。这确保即使在实施了 turbolinks 的情况下也能重新初始化 facebook 插件。
代码如下:
body
#fb-root
javascript:
(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/pl_PL/sdk.js#xfbml=1&appId=MY_APP_ID&version=v2.0";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
我在 rails 4 中使用子域创建了应用程序。它使用 Turbolinks。我给它添加了一个 facebook 插件。在生产中,当我刷新页面时,一切正常。但是,当我进入使用子域的 link 时,服务器响应 400 状态代码。
400 错误请求 请求 Header 或 Cookie 太大 nginx/1.6.2
如您所见,我使用 nginx 作为网络服务器。
我尝试调试它并注意到,在我的子域 facebook 插件上生成了两个额外的 cookie。
当我删除那些 cookie 时,我可以在我的子域上自由冲浪,直到我返回根域。之后,当我再次尝试访问我的子域时,这两个 cookie 再次生成,整个问题再次出现。
有谁知道为什么要创建它以及如何防止 facebook 生成它?
它没有出现在本地主机上。请问这是不是nginx的配置?
我当前的 FB 集成是使用 coffescript 提供的。
fb_root = null
fb_events_bound = false
fb_init = ->
loadFacebookSDK()
bindFacebookEvents() unless fb_events_bound
bindFacebookEvents = ->
$(document)
.on('page:fetch', saveFacebookRoot)
.on('page:change', restoreFacebookRoot)
.on('page:load', ->
FB?.XFBML.parse()
)
fb_events_bound = true
saveFacebookRoot = ->
fb_root = $('#fb-root').detach()
restoreFacebookRoot = ->
if $('#fb-root').length > 0
$('#fb-root').replaceWith fb_root
else
$('body').append fb_root
loadFacebookSDK = ->
window.fbAsyncInit = initializeFacebookSDK
$.getScript("//connect.facebook.net/pl_PL/all.js#xfbml=1")
initializeFacebookSDK = ->
FB.init
appId : 'my_app_id'
channelUrl: '//https://facebook.com/my_site
status : true
cookie : true
xfbml : true
@Facebook = { fb_init }
$(document).on "ready page:load pageshow", ->
Facebook.fb_init()
coffee_script 代码有问题。
我从https://developers.facebook.com/docs/plugins/like-button
复制代码解决了这个问题到正文标签后的 html 文件。这确保即使在实施了 turbolinks 的情况下也能重新初始化 facebook 插件。
代码如下:
body
#fb-root
javascript:
(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/pl_PL/sdk.js#xfbml=1&appId=MY_APP_ID&version=v2.0";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));