2015-10-17 103 views
2

我有一个托管在AWS Elasticbeanstalk上的Django应用程序,该应用程序运行的是Chrome扩展程序将Gmail数据通过扩展内容通过XmlHttpRequest()脚本 - 不是背景。SECTION_PROXY_SSL_HEADER在DJango设置导致CORS预检301响应状态代码(和失败)

许多人可能知道这是谁做的,Chrome需要Web服务的安全端点。因此,服务器上有第三方验证的证书,并且CORS已被正确设置,因为我在预检OPTIONS请求中获得了正确的响应标头。我现在遇到的问题使得整个事情崩溃了,现在是响应中的301状态代码,这会导致CORS请求失败 - 您也可能知道这会导致CORS进程按规范失败。

一些试验和错误之后,我已经确定了Django的SSL设置:

SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

其HTTP请求转发到HTTPS如果有涉及到代理(大概AWS是路由事物的方式)是导致失败。但是,如果我没有这种设置,Chrome会抛出“不安全的端点”错误并杀死请求。所以这是一个捕获22.有没有人有任何建议来解决这个问题?这里是我的预检OPTIONS请求和响应:

================REQUEST=========== Accept:*/* Accept-Encoding:gzip, deflate, sdch Accept-Language:en-US,en;q=0.8 Access-Control-Request-Headers:content-type Access-Control-Request-Method:POST Connection:keep-alive Host:www.example.com Origin:chrome-extension://p1312312dd1d1d1d1d1d3 Referer:https://mail.google.com/mail/u/0/ User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.71 Safari/537.36

================RESPONSE=========== Access-Control-Allow-Headers:content-type Access-Control-Allow-Methods:POST, OPTIONS Access-Control-Allow-Origin:* Connection:keep-alive Content-Language:en Content-Length:0 Content-Type:text/html; charset=utf-8 Date:Sat, 17 Oct 2015 17:07:13 GMT Location:https://www.example.com Server:Apache/2.4.12 (Amazon) mod_wsgi/3.5 Python/2.7.9 Vary:Accept-Language,Cookie X-Frame-Options:SAMEORIGIN

回答

2

我终于能有几件事的组合来解决:

  1. 从Django的设置中删除SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') .py,而是使用sslify来强制https重定向。

  2. 确保尾部'/'出现在原始CORS请求目标网址中,这也会导致3xx重定向。

  3. 通过将'Access-Control-Allow-Origin': '*','Access-Control-Allow-Methods': 'POST, OPTIONS','Access-Control-Allow-Headers': 'content-type',添加到Django的settings.py中的AWS_HEADERS设置,在AWS的服务器端加倍报头。

  4. 通过将os.environ['wsgi.url_scheme'] = 'https'添加到Django的settings.py中,在wsgi中添加另一个可能是冗余的https force。您也可以通过在wsgi.py中添加另一个https force os.environ['https'] = "on"来完成此操作。

所有这些东西放在一起证明可行,最后一个是最有可能的冗余,但有时请求将无法被识别为HTTPS离不开它。很有可能这是由于缓存,但比对不起更安全。

希望这可以帮助像我这样的人处理这个问题一段时间,没有任何明确的解决方案。

相关问题