部署在Cloud Run的Django应用出现无限301重定向问题求助
Django部署Cloud Run出现无限301重定向排查方案
问题背景
本地Docker运行正常的Django应用,部署到Cloud Run后出现无限301重定向,Cloud Run请求日志未提供重定向原因的有效信息。
部署用Dockerfile
# Pull base image FROM python:3.9.0 # Set environment variables ENV PIP_DISABLE_PIP_VERSION_CHECK 1 ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1 # Set work directory WORKDIR /code # Install dependencies COPY requirements.txt requirements.txt RUN pip install -r requirements.txt && \ adduser --disabled-password --no-create-home django-user # Copy project COPY . /code USER django-user # Run server CMD exec gunicorn -b :$PORT my_app.wsgi:application
关键配置(ALLOWED_HOSTS等)
CLOUDRUN_SERVICE_URL = env("CLOUDRUN_SERVICE_URL", default=None) if CLOUDRUN_SERVICE_URL: ALLOWED_HOSTS = [urlparse(CLOUDRUN_SERVICE_URL).netloc] CSRF_TRUSTED_ORIGINS = [CLOUDRUN_SERVICE_URL] # SECURE_SSL_REDIRECT = True SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https") else: ALLOWED_HOSTS = ["*"] ROOT_URLCONF = 'my_app.urls'
Cloud Run日志片段
[{ "insertId":"63ea0f3a0009301fc1588a44", "httpRequest":{ "requestMethod":"GET", "requestUrl":"https://stokkio-test-bizhlx6wsq-ez.a.run.app/", "requestSize":"719", "status":301, "responseSize":"821", "userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/110.0", "remoteIp":"80.208.2.138", "serverIp":"216.239.32.53", "latency":"0.016940322s", "protocol":"HTTP/1.1" }, "resource":{ "type":"cloud_run_revision", "labels":{ "location":"europe-west4", "configuration_name":"stokkio-test", "project_id":"stokkio", "revision_name":"stokkio-test-00007-nah", "service_name":"stokkio-test" } }, "timestamp":"2023-02-13T10:21:46.602143Z", "severity":"INFO", "labels":{"instanceId":"00f8b6bdb8eceaf16c38c4476e4bc4b018e5c36e674ddb382e5d1a5654e23693e60d6682d498b0cde1680fb9104257c4ef191c90bb395e9dd78bdef2870378149e"}, "logName":"projects/stokkio/logs/run.googleapis.com%2Frequests", "trace":"projects/stokkio/traces/64be6aa2f943773a97b8dca48c08183f", "receiveTimestamp":"2023-02-13T10:21:46.738718368Z", "spanId":"12503801728925259527" },...]
排查方向及解决方案
1. 校验CLOUDRUN_SERVICE_URL环境变量
- 确认变量值是Cloud Run服务的完整HTTPS地址(如
https://stokkio-test-bizhlx6wsq-ez.a.run.app),如果末尾带斜杠,urlparse提取的netloc会异常,导致ALLOWED_HOSTS不匹配,触发Django默认重定向。 - 可临时在启动命令中添加
echo $CLOUDRUN_SERVICE_URL,或通过Cloud Run控制台查看变量是否配置正确。
2. 确认SECURE_PROXY_SSL_HEADER生效
Cloud Run通过X-Forwarded-Proto传递请求协议,若Django未正确识别该头,会误判请求为HTTP,进而触发HTTPS重定向(即使请求本身是HTTPS):
- 确保
SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https")未被其他配置覆盖,确实加载到生产环境配置中。 - 可在测试视图中打印
request.META.get('HTTP_X_FORWARDED_PROTO'),验证请求头是否被正确接收。
3. 检查URL配置中的重定向规则
- 查看
ROOT_URLCONF对应的urls.py文件,是否存在根路径/的重定向规则(如redirect视图或path('', RedirectView.as_view(url='/some-path/'))),若目标路径也存在同类重定向,会引发循环。 - 排查是否有自定义中间件在强制修改响应头添加重定向。
4. 验证Cloud Run端口配置
确保Cloud Run容器端口与gunicorn监听端口一致:gunicorn使用$PORT变量,Cloud Run会自动注入该变量(默认8080),端口不匹配可能导致请求异常转发。
5. 查看Django内部日志
Cloud Run请求日志仅记录外部请求,需开启Django内部日志获取重定向具体原因:
- 在settings.py中配置日志输出到标准输出:
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console': { 'class': 'logging.StreamHandler', }, }, 'root': { 'handlers': ['console'], 'level': 'DEBUG', }, }
- 重新部署后,查看Cloud Run的容器日志,里面会包含Django的详细日志,比如重定向的触发源。
内容的提问来源于stack exchange,提问作者Basley
相关产品推荐
相关产品推荐

