我有一個使用 Django 作為后端和 Nginx 以及 Gunicorn 作為反向代理的 Web 應用程式。我已經設定了 Nginx 配置,當通過 HTTPS 發送請求時它可以完美運行。但是在發出 HTTP 請求時它會失敗。
我希望應用程式同時適用于 HTTP 和 HTTPS 請求。
我的一些 Django 視圖包含通過 HTTP 發出的內部請求,因為它們必須與開發服務器和生產服務器兼容
class LoginView(APIView):
...
http_host = request.META["HTTP_HOST"]
url = f"http://{http_host}/o/token/"
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
data = {
'username': req_data['username'],
'password': req_data['password'],
}
response = requests.post(url, headers=headers, data=data)
...
我的nginx配置如下
server {
listen 8000 ssl;
server_name backend.test.com www.backend.test.com;
access_log /var/log/nginx/app_backend.access.log;
error_log /var/log/nginx/app_backend.error.log;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/testuser/app_backend/app_backend;
}
location /media/ {
root /home/testuser/app_backend/app_backend;
}
location / {
include proxy_params;
proxy_pass http://unix:/home/testuser/app_backend/app_backend/app_backend.sock;
}
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/backend.test.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/backend.test.com/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
}
我在數字海洋上托管了 VPS。
如何使服務器也為后端視圖內部發出的 http 請求作業
注意:我試圖通過這樣做將所有 HTTP 請求重定向到 HTTPS 僅在 Nginx 的生產中return 301 https://$host$request_uri;,但這不起作用
uj5u.com熱心網友回復:
我要在這里冒險并假設您實際上并不想要您所要求的...相反,您只需要使用相同的架構,該架構也應該在請求中可用
url = f"{request.scheme}://{request.META['HTTP_HOST']}/o/token"
請注意...我不是 100% 確定這不會保留埠(如果需要它應該在META['SERVER_PORT'])
或者定義第二個 HTTP 服務器(確保從第一個服務器中洗掉 :8000)
server {
listen 8000 80;
server_name backend.test.com www.backend.test.com;
access_log /var/log/nginx/app_backend.access.log;
error_log /var/log/nginx/app_backend.error.log;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/testuser/app_backend/app_backend;
}
location /media/ {
root /home/testuser/app_backend/app_backend;
}
location / {
include proxy_params;
proxy_pass http://unix:/home/testuser/app_backend/app_backend/app_backend.sock;
}
}
但我認為這通常被認為是不好的做法
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/410647.html
標籤:
