You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django+Nginx+Gunicorn部署:HTTPS路径目录无法访问求助

Nginx配置导致HTTPS子路径无法访问的问题

问题描述

  • 部署环境:DigitalOcean Droplet,对Nginx及Web部署不熟悉
  • 当前状态:通过http://[SERVER-IP](如http://46.101.92.95/)可正常访问所有路径;HTTPS根路径(https://rejesto.com/)能加载,但rejesto.com/[X]这类子路径均无法访问
  • 页面链接:由Django的{% url '[url]' %}标签生成,本地环境及IP访问子路径(如http://46.101.92.95/blog)均正常
  • 问题定位:推测是Nginx配置问题,因为IP访问子路径正常,HTTPS子路径不行

现有Nginx配置文件(/etc/nginx/sites-available/rejesto.com)

server {

   server_name rejesto.com www.rejesto.com;
   location / {
        try_files $uri $uri/ =404;
        include proxy_params;
        proxy_pass http://unix:/run/gunicorn.sock;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/rejesto/myprojectdir;
    }

    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot                                                   
    ssl_certificate /etc/letsencrypt/live/rejesto.com/fullchain.pem; # managed by Certbot  
    ssl_certificate_key /etc/letsencrypt/live/rejesto.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                    
                                                                                           
} 

server {
    if ($host = www.rejesto.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    if ($host = rejesto.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80;
    listen [::]:80;

    server_name rejesto.com www.rejesto.com;

    location / {
        include proxy_params;
        proxy_pass http://unix:/run/gunicorn.sock;
    }

    return 404; # managed by Certbot

}


server {

    listen 80;
    server_name 46.101.92.95;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/rejesto/myprojectdir;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/run/gunicorn.sock;
    }
}
解决方案

问题根源在HTTPS server块的location /配置里的try_files $uri $uri/ =404;这一行。

当访问HTTPS子路径(比如https://rejesto.com/blog)时,Nginx会先去本地文件系统找对应路径的文件/目录,找不到就直接返回404,根本不会把请求转发给Gunicorn处理Django的路由。而IP访问的server块没有这行配置,所以请求能正常传给Django。

修改步骤:

  1. 编辑HTTPS server块的location /部分,移除try_files $uri $uri/ =404;这一行,修改后的配置如下:
server {
   server_name rejesto.com www.rejesto.com;
   location / {
        include proxy_params;
        proxy_pass http://unix:/run/gunicorn.sock;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/rejesto/myprojectdir;
    }

    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot                                                   
    ssl_certificate /etc/letsencrypt/live/rejesto.com/fullchain.pem; # managed by Certbot  
    ssl_certificate_key /etc/letsencrypt/live/rejesto.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                    
}
  1. 验证Nginx配置是否正确:
sudo nginx -t
  1. 重启Nginx生效:
sudo systemctl restart nginx

这样HTTPS的子路径请求就会被正确转发给Django处理,所有页面都能正常访问了。

内容的提问来源于stack exchange,提问作者Rejesto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 11:05:18