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

如何实现Django网站www域名到非www域名的正确重定向

Django 从www域名重定向到非www域名配置方法

你之前安装的django-redirect-to-non-www不生效,绝大多数情况是中间件配置顺序错误,按下面的方法排查配置即可,也可以选择不依赖第三方库的原生实现,或者性能更好的Web层重定向方案。

方案1:修复第三方库配置

  • 打开项目下的settings.py,找到MIDDLEWARE配置列表,必须将redirect_to_non_www.middleware.RedirectToNonWww放在列表的第一个位置。Django中间件按从上到下的顺序执行,如果该中间件前面有其他拦截请求的逻辑,重定向规则根本不会触发。
  • 检查settings.py中是否存在PREPEND_WWW = True的配置,若有需要改成PREPEND_WWW = False,避免和第三方库的规则冲突。
  • 确认ALLOWED_HOSTS配置同时包含带www和不带www的两个域名,例如ALLOWED_HOSTS = ['yourdomain.com', 'www.yourdomain.com']。
  • 注意该中间件在DEBUG = True的本地开发环境默认不生效,本地测试需要临时关闭DEBUG模式,或者直接部署到测试环境验证。
  • 配置修改完成后重启Django服务,清空浏览器缓存后再测试,301重定向会被浏览器强缓存,很容易出现配置改了但还是跳旧地址的情况。

方案2:Django原生中间件实现(无第三方依赖)

不想依赖第三方库的话,自己写10行左右的中间件就能实现,逻辑可控不会出现未知兼容问题:

  • 在你的任意一个业务app目录下新建middleware.py文件,写入以下代码:
from django.http import HttpResponsePermanentRedirect

class NonWwwRedirectMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        host = request.get_host()
        # 识别带www前缀的请求
        if host.startswith('www.'):
            no_www_host = host[4:]
            # 保留原请求的路径、参数,做永久重定向
            redirect_url = f"{request.scheme}://{no_www_host}{request.get_full_path()}"
            return HttpResponsePermanentRedirect(redirect_url)
        return self.get_response(request)
  • 回到settings.py的MIDDLEWARE列表,把你刚写的中间件路径放到列表第一个位置,格式为'your_app_name.middleware.NonWwwRedirectMiddleware',替换成你自己的app名即可。
  • 同样保证ALLOWED_HOSTS包含两个域名,重启服务就生效。

方案3:Nginx层重定向(生产环境优先选)

如果生产环境用Nginx做反向代理,直接在Nginx层配置重定向是最优方案,请求不需要走到Django业务逻辑,性能最高,也不会受Django代码改动影响:

  • 打开Nginx对应的站点配置文件,单独新增一个server块用来监听带www的域名:
server {
    listen 80;
    listen 443 ssl;
    server_name www.yourdomain.com;

    # 和主站保持一致的SSL证书配置,否则HTTPS访问会报证书错误
    ssl_certificate /path/to/your/fullchain.pem;
    ssl_certificate_key /path/to/your/privkey.pem;

    # 301永久重定向到非www域名,保留原请求路径
    return 301 $scheme://yourdomain.com$request_uri;
}
  • 原来的主服务server块只保留不带www的域名配置:server_name yourdomain.com;
  • 执行nginx -t检查配置无语法错误后,执行nginx -s reload重载配置即可生效。

注意:测试重定向规则的时候,建议先把301永久重定向改成302临时重定向,确认跳转逻辑完全正确后再换回301。301重定向会被浏览器本地长期缓存,一旦规则配错,后续修正后用户侧可能要很久才能更新缓存。

内容的提问来源于stack exchange,提问作者WebMi Digital

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 02:51:31