Nginx代理Flask与Django应用时出现404错误的问题排查
问题解决思路与方案
一、先搞定Nginx的双斜杠问题
你的Nginx配置里的rewrite规则是双斜杠的罪魁祸首。原规则rewrite ^/v2(.*) /$1 break;在匹配/v2/admin时,$1会捕获到/admin,拼接后就变成了//admin。改一下规则和location的写法:
修改后的/v2 location块:
location /v2/ { rewrite ^/v2/(.*)$ /$1 break; proxy_pass http://127.0.0.1:8000/; # 末尾必须加斜杠,保证路径拼接正确 include /etc/nginx/proxy_params; proxy_redirect off; sub_filter 'href="/' 'href="/v2/'; sub_filter_once off; }
- 把location改成
/v2/(带末尾斜杠),避免和根路径的location冲突 - rewrite规则精准匹配
/v2/后面的内容,$1只会拿到admin而不是/admin,不会产生双斜杠 - proxy_pass末尾加斜杠,Nginx会自动把rewrite后的路径拼到后端地址后面,最终传给Django的就是
/admin
二、修正Django的反向代理配置
就算Nginx路径对了,Django可能因为反向代理的参数没配对,还是识别不了请求。修改settings.py:
# 必须把你的域名加到ALLOWED_HOSTS里,不然Django会直接拒绝请求 ALLOWED_HOSTS = ['my-subdomain.my-domain.com', '127.0.0.1'] # 开启这两个设置,让Django知道请求是通过HTTPS反向代理过来的 USE_X_FORWARDED_HOST = True SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') # 如果静态文件或者URL生成还有问题,可以加这个(Nginx配置对的话一般不需要) # FORCE_SCRIPT_NAME = '/v2'
三、收尾操作
- 重启Nginx:
sudo systemctl restart nginx - 重启你的Django服务(比如用Gunicorn的话就重启Gunicorn)
- 再访问
https://my-subdomain.my-domain.com/v2/admin试试,应该能正常加载了
内容的提问来源于stack exchange,提问作者Mihai-Andrei Neacsu
相关产品推荐
相关产品推荐

