【发布时间】:2021-05-12 22:05:35
【问题描述】:
我目前正在开发一个由 React 前端组成的应用程序,它经常向 Django 后端发出请求。 React 和 Django 应用程序都在同一台服务器上运行。
我的问题是我希望对外界隐藏我的 Django 后端,所以它只接受来自我的 React 应用程序的请求。为此,我一直在我的 Django settings.py 中尝试了 ALLOWED_HOSTS 的几种配置,但到目前为止,它们似乎都没有成功。我希望隐藏的示例路线如下:
https://api.jobot.es/auth/user/1
一开始我尝试了以下配置:
ALLOWED_HOSTS=['jobot.es']
但是,虽然这隐藏了 Django 后端,但它也阻止了来自 React 应用程序(在 jobot.es)的请愿书。将配置更改为:
ALLOWED_HOSTS=['127.0.0.1']
使我的 React 应用程序能够访问后端,但世界其他地方也可以。当外部世界无法访问 Django 后端时,来自https://api.jobot.es/auth/user/1 的获取请求应返回 400“错误请求”状态。
当 React 应用程序无法从 Django 后端请求数据时,我得到的错误如下:
Access to XMLHttpRequest at 'https://api.jobot.es/auth/login' from origin 'https://jobot.es' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.,但在 settings.py 中,我允许所有带有 CORS_ORIGIN_ALLOW_ALL = True 的 Cors 起源。
我的 React 应用程序的 url 是 https://jobot.es,而 Django 后端的 url 是 https://api.jobot.es,但是由于两个应用程序都托管在同一台服务器上,因此两个 url 都解析到相同的 IP 地址。在服务器上,我使用 Nginx 将流量相应地重定向到 React 应用程序或 Django 后端。
如果有任何帮助,这里是 React 应用程序(第一)和 Django 后端(第二)的 Nginx 配置:
React 应用 Nginx 配置
server {
server_name jobot.es www.jobot.es;
access_log off;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Real-IP $remote_addr;
add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"';
}
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/jobot.es/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/jobot.es/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = jobot.es) {
return 301 https://$host$request_uri;
} # managed by Certbot
server_name jobot.es;
listen 80;
return 404; # managed by Certbot
}
Django 后端 Nginx 配置:
server {
server_name api.jobot.es;
access_log off;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Real-IP $remote_addr;
add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"';
}
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/jobot.es/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/jobot.es/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = api.jobot.es) {
return 301 https://$host$request_uri;
} # managed by Certbot
server_name api.jobot.es;
listen 80;
return 404; # managed by Certbot
}
我还附上了 React App 和 Django 后端的 GitHub 存储库,希望它们能有所帮助。 反应应用: https://github.com/PaburoTC/jobot DJango 后端: https://github.com/PaburoTC/JoboBackend
提前谢谢你
【问题讨论】: