Django子路径/app部署下静态文件配置异常求助
Django子路径(/app)下静态文件配置方案
针对部署在www.example.com/app路径下的Django 5.0项目,解决静态文件404问题的步骤如下:
1. 修正settings.py配置
确保以下参数设置正确,FORCE_SCRIPT_NAME指定子路径前缀,STATIC_URL/MEDIA_URL对应完整的URL路径:
FORCE_SCRIPT_NAME = "/app" STATIC_URL = "/app/static/" MEDIA_URL = "/app/media/" STATIC_ROOT = "/home/hostxxx/domains/webpage.com/DjangoApp/static" MEDIA_ROOT = "/home/hostxxx/domains/webpage.com/DjangoApp/media" # 若项目有自定义静态文件源目录,添加以下配置(按需) # STATICFILES_DIRS = [os.path.join(BASE_DIR, "static")]
2. 调整passenger_wsgi.py
Passenger环境下需显式设置SCRIPT_NAME环境变量,确保Django识别子路径前缀:
import os import sys # 将项目目录加入Python路径 sys.path.insert(0, os.path.dirname(__file__)) # 强制设置子路径前缀 os.environ['SCRIPT_NAME'] = '/app' os.environ.setdefault("DJANGO_SETTINGS_MODULE", "你的项目名称.settings") from django.core.wsgi import get_wsgi_application application = get_wsgi_application()
3. 配置urls.py静态文件路由
添加静态文件和媒体文件的路由映射,确保Django能正确处理开发环境的静态文件请求(生产环境建议由Web服务器直接处理):
from django.conf import settings from django.conf.urls.static import static from django.contrib import admin from django.urls import path urlpatterns = [ path('admin/', admin.site.urls), # 此处添加你的其他应用路由 ] # 挂载静态文件与媒体文件路由 urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
4. 重新收集静态文件
执行命令将所有应用的静态文件复制到STATIC_ROOT指定的目录:
python manage.py collectstatic
5. 配置Web服务器(Passenger)
确保Web服务器正确映射静态文件路径,避免让Django处理静态文件请求(提升性能并避免路径错误):
Apache+Passenger示例配置
<Location /app> PassengerAppRoot /home/hostxxx/domains/webpage.com/DjangoApp PassengerBaseURI /app PassengerPython /path/to/your/python/env/bin/python </Location> # 直接映射静态文件URL到本地目录 Alias /app/static/ /home/hostxxx/domains/webpage.com/DjangoApp/static/ <Directory /home/hostxxx/domains/webpage.com/DjangoApp/static> Require all granted </Directory>
Nginx+Passenger示例配置
location /app { passenger_base_uri /app; passenger_app_root /home/hostxxx/domains/webpage.com/DjangoApp; passenger_enabled on; passenger_python /path/to/your/python/env/bin/python; } # 直接映射静态文件URL到本地目录 location /app/static/ { alias /home/hostxxx/domains/webpage.com/DjangoApp/static/; }
问题原因说明
- 单独设置
FORCE_SCRIPT_NAME在Passenger环境下可能失效,因为Passenger会自行覆盖该变量,需在passenger_wsgi.py中显式设置SCRIPT_NAME环境变量。 - 若Web服务器未正确映射静态文件路径,会导致请求被转发至Django,引发路径解析错误,因此需让Web服务器直接处理静态文件请求。
内容的提问来源于stack exchange,提问作者Jareq
相关产品推荐
相关产品推荐

