EC2部署Django REST Framework非根路径404问题求助
问题解决:Nginx下Django仅根路径可访问,其他路径返回404
核心原因
你的Nginx配置里,location /块的try_files $uri $uri/ =404逻辑存在问题:Nginx会优先尝试在本地服务器查找请求对应的文件或目录,找不到就直接返回404,根本没把请求转发给Gunicorn去处理Django的路由规则。而直接用Gunicorn启动时,所有请求都由Django接管,所以所有路径都能正常访问。
另外server_name配置里多了个斜杠,属于无效配置,建议一并修正。
解决方案
1. 修改Nginx配置文件
编辑/etc/nginx/sites-available/default,做以下调整:
修正
server_name:server_name 35.154.109.114;重构
location /块,让静态文件找不到时转发给Gunicorn处理:location / { include proxy_params; # 先尝试本地静态文件,找不到就交给Django处理 try_files $uri $uri/ @proxy_to_django; } # 定义转发到Gunicorn的规则 location @proxy_to_django { proxy_pass http://unix:/var/www/html/api.drpashu/app.sock; }
2. 可选:优化Django的urls.py(非必须,仅做规范优化)
你的urls.py里有重复的静态资源配置,且混用了旧的url()和新的path()语法,可以优化为:
from django.contrib import admin from django.urls import path, include from django.conf import settings from django.conf.urls.static import static urlpatterns = [ path('admin/', admin.site.urls), path('', include('main.urls')), path('', include('poultryapp.urls')), path('', include('Vet.urls')), path('', include('call_module.urls')), path('', include('payment.urls')), path('', include('adminApp.urls')), path('', include('community.urls')), path('', include('sdk.urls')), path('', include('cooperative.urls')), ] # 仅在DEBUG模式生效的静态/媒体文件服务,生产环境建议由Nginx直接处理 if settings.DEBUG: urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
3. 重启服务生效
修改完配置后,重启Nginx和Supervisor使配置生效:
sudo systemctl restart nginx sudo supervisorctl restart all
调整后,Nginx会先处理静态文件请求,非静态请求都会转发给Gunicorn,由Django的路由系统处理,所有路径即可正常访问。
内容的提问来源于stack exchange,提问作者SG26
相关产品推荐
相关产品推荐

