如何在带负载均衡的Google Cloud Run子路径部署Django应用?
解决Django部署在Cloud Run子路径的404问题
问题原因
设置FORCE_SCRIPT_NAME = "/directory"后,Django会自动在所有URL前添加该前缀,但你的负载均衡并未剥离请求路径中的/directory,导致实际处理时路径叠加为/directory/directory,触发404错误。
解决方案
方案一:调整负载均衡路径映射(推荐)
- 修改负载均衡的URL映射规则:将
https://example.com/directory/*的请求转发到Cloud Run服务时,剥离/directory前缀,转发到服务的/*路径。 - 保留
settings.py中的FORCE_SCRIPT_NAME = "/directory"配置,确保Django生成的URL自动带上/directory前缀。 - 确认
settings.py的关键配置:USE_X_FORWARDED_HOST = True SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') ALLOWED_HOSTS = ['example.com'] # 根据实际域名调整,可使用通配符 - 保持现有URLconf不变,此时访问
https://example.com/directory会被转发到服务的根路径/,匹配directory.urls的空路径,返回正确内容。
方案二:调整Django URLconf(无需修改负载均衡)
- 移除
settings.py中的FORCE_SCRIPT_NAME = "/directory"配置。 - 修改主项目的
example_dir/urls.py,给所有路径添加directory前缀:urlpatterns = [ path("directory/admin/", admin.site.urls), path("directory/", include("directory.urls")), ] - 保持
directory/urls.py的配置不变,此时访问https://example.com/directory会直接匹配到directory.urls的空路径,避免路径叠加。
验证
两种方案均能解决404问题,方案一更符合反向代理子路径部署的最佳实践,可确保Django生成的静态资源、管理后台等URL自动带上/directory前缀,避免后续路径问题。
内容的提问来源于stack exchange,提问作者Nathan Lloyd
相关产品推荐
相关产品推荐

