程序只是一个用 padrino 搭起来的非常简单的博客,使用了 Padrino Admin,代码在这个 repo,我没有修改过任何 app 的配置代码 https://github.com/CicholGricenchos/cichol_blog
在本地用 Linux 虚拟机运行良好,代码原封不动搬到 vps 上,原先也是良好的,但是不知道什么时候开始(今天发现)登陆管理页就会出现WARN - attack prevented by Rack::Protection::AuthenticityToken
。
我重启了服务器,重新拷贝了一份代码,问题仍然出现,考虑可能不是代码的问题,换了 IE 就登陆成功了。实际上在 config/app.rb 里禁用 csrf 保护也可以登陆成功,但是在保存文章的时候会重定向回登陆页,我暂时还没有去看 Padrino 那个权限管理模块的源码,也不知道为什么。
服务器端使用了 nginx+thin,nginx 只写了一行 proxy_pass。
这个问题是由什么产生的呢?
现在可以排除 nginx 的问题(未启用仍然出错),排除 thin 的问题(使用 webrick 一样出错),排除 csrf 标签错误,排除旧 session/cookie(chrome 新建隐形窗口仍旧出错,ios5 的 safari 首次访问即出错)。
尝试用 curl 提交表单一样出现错误,问题肯定与这两个方面(本地服务器-vps,chrome-ie)都相关,浏览器端应该没有异常的可能,难道服务器还有未知的判断跨站的指标?或者客户端和 vps 的通信有问题?
使用 sinatra 和 Rack::Protection::AuthenticityToken 在 vps 上测试良好,这样的话应该就可以认定是 padrino 的问题了。
换了一个域名之后 post 可以正常工作了。。之前搞错了,并没有关闭 nginx,可能确实是 nginx 反代导致的
问题已解决,是 nginx 配置有问题,我参照网上的反代配置加了几行 proxy_set_header 就可以正常工作了,还没有去了解这几行代码的含义