在子目录部署Django:链接缺失mysite前缀的统一解决方法
问题背景
目录结构
C:\htdocs # web根目录 |_ django-container +- django-project | +- core # startproject生成的项目根目录 | |_ myapp1 # startapp生成的应用 +- public +- static # STATIC_ROOT,collectstatic目标目录 | +- css | +- images | |_ js |_ media # MEDIA_ROOT
Nginx配置
http { # ... upstream wsgi-server { server 127.0.0.1:8080; } server { # ... location /mysite/ { proxy_pass http://wsgi-server/; } location /mysite/public/media/ { alias C:/htdocs/django-container/public/media/; autoindex off; } location /mysite/public/static/ { alias C:/htdocs/django-container/public/static/; autoindex off; } } }
当前运行配置
- 使用Waitress作为WSGI服务器,在8000端口运行,指向
core.wsgi.application - Django配置:
MEDIA_URL = 'public/media/',STATIC_URL = 'public/static/'
问题
应用内重定向、模板生成的URL均缺少mysite前缀,导致静态资源、媒体资源链接及页面跳转全部失效。希望找到统一自动添加mysite前缀的方案,而非手动修改STATIC_URL和MEDIA_URL。
解决方案
1. 设置FORCE_SCRIPT_NAME(核心步骤)
在Django项目的settings.py中添加以下配置:
FORCE_SCRIPT_NAME = '/mysite'
该配置会告知Django自身部署在/mysite路径下,所有通过Django生成的URL(包括{% url %}模板标签、reverse()函数、{% static %}/{% media %}标签生成的资源链接,以及应用内重定向地址)都会自动带上/mysite前缀,完全匹配Nginx的路由规则。
2. 验证Nginx配置(可选调整)
保持原有Nginx配置即可,location /mysite/会将请求前缀去掉后转发给Waitress,配合FORCE_SCRIPT_NAME即可正确解析请求和生成URL。
若遇到请求路径解析问题,可在Nginx的location /mysite/块中添加以下头信息,确保Django能正确识别请求前缀:
location /mysite/ { proxy_pass http://wsgi-server/; proxy_set_header X-Forwarded-Prefix /mysite; }
通常仅设置FORCE_SCRIPT_NAME就足够解决问题。
3. 验证效果
重启Waitress服务和Nginx后:
- 模板中
{% static 'css/style.css' %}会生成/mysite/public/static/css/style.css,匹配Nginx的静态资源路由 - 应用内重定向(如
redirect(reverse('myapp1:index')))会生成/mysite/index/(对应URL配置) - 所有页面跳转和资源链接都会自动带上
mysite前缀,无需手动修改任何URL配置
内容的提问来源于stack exchange,提问作者fishfin
相关产品推荐
相关产品推荐

