由于“#”,Nginx 1.2.3截断了Facebook代码参数值

时间:2012-08-16 12:57:59

标签: facebook nginx

我在我的网站上使用Facebook身份验证。

我使用的是Nginx 1.2.3。

Facebook使用以下模式生成URL:

  

=“&GT; HTTPS:?//www.mysite.net/profile.xhtml状态= dfecc191-5eb5-4e08-A514-bc70fdc17611&安培;代码= AQBKJ_1VuycE7-DPigKfrAt9BLGQJww-p0RKY_Lta6uDxsaMUgzR98soPiOD6NDZ6kyU-NJUHmpAqEOSCxOKi7UGgh0fJSfC9kyh18FtSbQNJdyNEkkfaNtP9GMC8y25W6fOjyR2fj3OnQQTFDwmm-gckqofvhJsmnPSWgHxaan7uiaz_Wgc5JcdTu2DfzhOjqUQ_QG7X14jWDdq9CUtHuSV# = < / em>的

正如您所见,facebook在代码参数值的末尾添加#_=_

现在,如果您尝试使用#中构建任何类型的URL GET,NGINX将在遇到#,this for instance时停止解析请求。

提供以下日志:

  

[16 / Aug / 2012:11:25:33 +0200]“GET /index.html?value1=jo HTTP / 1.1”200 4976“ - ”“Mozilla / 5.0(Macintosh; Intel Mac OS X 10_6_8) AppleWebKit / 537.1(KHTML,如Gecko)Chrome / 21.0.1180.79 Safari / 537.1“

就我而言,Nginx停止解析请求并从代码参数值中删除“# = ”!

有什么想法吗?

感谢。

PS:这与Apache完美配合。

2 个答案:

答案 0 :(得分:1)

所以服务器处理哈希(#_ = _)的方式是他们通常忽略它。

这个哈希应该与facebook返回的代码是否有效无关。

什么影响它的成功就是套管。在尝试使用代码之前,请确保您没有在请求参数上调用.ToLower()(或类似函数)。

希望这有帮助!

答案 1 :(得分:1)

我认为你错了 - 没有浏览器(如果你混淆它就会期待IE)会将URL的片段部分发送到服务器 - 这也是HTTP规范。

你说这适用于Apache几乎是不可能的。

您的示例是完全有效的网址,但URI部分为http://www.mysite.net/index.html?value1=jo,因为#hn&amp; value2 = doe实际上是网址的片段部分。