You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

部署在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 13:25:51