Django部署至虚拟共享服务器后Admin登录POST请求出现404错误
解决Django Admin登录POST请求404问题的排查方案
我之前在虚拟共享服务器部署Django时也碰到过类似的坑,Admin页面能正常打开,但提交登录凭据就跳404,大概率和服务器的URL转发、配置规则有关,咱们一步步来排查:
1. 先确认项目URL配置是否规范
首先检查你项目根目录的urls.py,确保Admin的路由是带末尾斜杠的:
# 项目根urls.py from django.contrib import admin from django.urls import path urlpatterns = [ path('admin/', admin.site.urls), # 重点:这里必须带末尾斜杠 # 其他业务路由... ]
如果写成admin(不带斜杠),共享服务器的重写规则很可能会在POST请求时截断路径,导致找不到对应的处理路由。
2. 检查服务器的URL重写配置
Apache环境(多数虚拟共享服务器用这个)
查看项目根目录的.htaccess文件,确保它能把所有请求(包括POST)正确转发到WSGI入口:
RewriteEngine On # 排除静态文件和目录的请求 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 把所有请求转发到wsgi.py处理 RewriteRule ^(.*)$ wsgi.py/$1 [L]
另外要确认服务器已经开启mod_rewrite模块,很多共享主机默认开启,但如果没开得联系主机商帮忙启用。
Nginx环境
如果是Nginx配置,检查站点配置里的location规则,确保POST请求不会被拦截:
location / { try_files $uri $uri/ @django; } location @django { include uwsgi_params; uwsgi_pass unix:/path/to/your/project.sock; # 或者http://127.0.0.1:8000 }
这里要注意try_files的规则,不能让POST请求被静态文件规则拦截。
3. 验证CSRF相关配置(虽然一般是403,但也可能间接导致404)
本地正常但服务器异常,可能是域名相关的CSRF配置问题:
- 确认
settings.py里的ALLOWED_HOSTS包含你的域名:
ALLOWED_HOSTS = ['lindcraft.williesworkshop.com', 'localhost', '127.0.0.1']
- Django 3.2及以上版本,要把域名加入
CSRF_TRUSTED_ORIGINS:
CSRF_TRUSTED_ORIGINS = ['https://lindcraft.williesworkshop.com']
如果CSRF验证失败,部分服务器会重定向到错误路径,间接触发404。
4. 检查WSGI入口文件的正确性
确认你的wsgi.py文件路径和内容都没问题,共享服务器经常会因为路径配置错误导致请求找不到处理入口:
# wsgi.py import os from django.core.wsgi import get_wsgi_application os.environ.setdefault('DJANGO_SETTINGS_MODULE', '你的项目名.settings') application = get_wsgi_application()
要确保服务器控制面板里指定的WSGI入口路径和这个文件的实际路径完全一致。
5. 查看服务器错误日志(最关键的一步)
直接看服务器的错误日志能快速定位问题:
- Apache一般看
error.log,Nginx看error.log,Django如果配置了日志也看django.log - 共享服务器通常在主机控制面板里有日志入口,或者可以通过FTP/SSH访问日志文件
日志里会明确告诉你404的具体原因,比如哪个URL匹配失败、请求被哪个规则拦截了。
我当时碰到的问题就是.htaccess里的RewriteRule写错了,把POST请求的路径截断了,调整规则后就正常了。你可以先从URL配置和.htaccess开始排查,这两个是虚拟主机上最常见的触发点。
内容的提问来源于stack exchange,提问作者Bill Leddy
相关产品推荐
相关产品推荐

