具有多个允许主机的Django和CORS策略

时间:2019-07-13 11:00:29

标签: javascript django django-rest-framework cors

我有一个运行在带有NGINX和gunicorn的ubuntu服务器上的Django小项目。

当用户访问 www .example.com时,一切都很好,但是,当用户访问example.com而不是www.example.com时,这一切都将消失。我在fetch命令中使用了一些javascript,从我的API(Django REST)中获取数据,并且它返回:

Access to fetch at 'https://www.example.com/builds/apidata/4' 
from origin 'https://example.com' has been blocked by CORS 
policy: No 'Access-Control-Allow-Origin' header is present on the requested 
resource. If an opaque response serves your needs, set the request's mode to 
'no-cors' to fetch the resource with CORS disabled.

我找到的最简单的解决方案是从ALLOWED_HOSTS文件中的settings.py中删除example.com,但是当用户忘记www.时,他们会遇到404错误

CORS错误消息还指出我可以更改请求模式,但是我不知道这样做的安全性。

我也尝试对我的域设置使用重定向,从example.com到www.example.com,但这似乎也不起作用。

任何建议将不胜感激!

2 个答案:

答案 0 :(得分:1)

在Web服务器配置中,您可以在www子域上添加一个Access-Control-Allow-Origin标头,该标头将允许来自根域的请求。

这将起作用:Access-Control-Allow-Origin: https://example.com

答案 1 :(得分:1)

尽管您当然可以使用CORS允许这种跨域使用,但一种更简单,更干净的解决方案是仅允许一个根域,无论是否使用www

PREPEND_WWW设置为True是一种确保请求始终使用www版本的简单方法,因为它会导致CommonMiddleware在非{{ 1}}版本。