Nginx多域名跳转配置教程:如何实现指定域名独立访问不跳转

5

一、问题场景与需求分析

在网站运营与SEO优化过程中,多域名跳转是常见的技术手段。通常我们会将多个旧域名或备用域名通过301重定向统一跳转至主站,以集中页面权重、避免内容重复。但在实际业务中,往往存在例外需求:某个特定域名(如子域名或独立业务域名)需要直接访问,不参与跳转

例如,主站为 main-domain.com,需要将 old-domain.comwww.old-domain.comalias-domain.com 全部跳转至主站,但要求 sub.main-domain.com 保持独立访问。本文将给出完整的Nginx配置实现方案。

二、核心实现原理

Nginx处理请求时,会根据 listen 端口和 server_name 进行server块匹配。要实现"部分跳转、部分独立",核心思路是:

  • 精确拆分:将需要跳转的域名与需要独立的域名分别放入不同的server块

  • HTTP与HTTPS双层分离:在80端口和443端口分别做独立配置

  • 业务块扩容:在主业务server块的 server_name 中加入独立域名,使其直接提供服务

三、分步配置实现

1. HTTP层:分离跳转逻辑

将原本统一跳转的server块拆分为两个:一个负责旧域名跳转主站,另一个仅负责独立域名跳转至自身的HTTPS。

# 其他域名:HTTP跳转至主站HTTPS
server {
    listen 80;
    server_name www.old-domain.com old-domain.com alias-domain.com;
    location ~ /\.well-known {
        allow all;
    }
    return 301 https://main-domain.com$request_uri;
}

# 独立域名:HTTP仅跳转至自身HTTPS
server {
    listen 80;
    server_name sub.main-domain.com;
    location ~ /\.well-known {
        allow all;
    }
    return 301 https://sub.main-domain.com$request_uri;
}

2. HTTPS层:旧域名跳转主站

在443端口,同样将独立域名从跳转列表中移除,仅保留需要跳转的旧域名。

server {
    listen 443 ssl http2;
    server_name www.old-domain.com old-domain.com alias-domain.com;
    ssl_certificate    /path/to/cert/fullchain.pem;
    ssl_certificate_key    /path/to/cert/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:!MD5;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    add_header Strict-Transport-Security "max-age=31536000";
    return 301 https://main-domain.com$request_uri;
}

3. 主业务块:绑定独立域名

在主站业务server块中,将 server_name 从单一主站扩展为包含独立域名,这样该域名访问时直接由主站逻辑处理,不会发生跳转。

server {
    listen 443 ssl http2;
    server_name main-domain.com sub.main-domain.com;
    root /path/to/wwwroot;
    index index.php index.html;
    
    ssl_certificate    /path/to/cert/fullchain.pem;
    ssl_certificate_key    /path/to/cert/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:!MD5;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    
    location / {
        try_files $uri $uri/ /index.php?$args;
    }
    
    # PHP处理
    location ~ \.php$ {
        try_files $uri /index.php?$args;
        fastcgi_pass unix:/path/to/php-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
    
    # 安全与缓存配置...
}

四、完整脱敏配置示例

以下是整合后的完整配置,所有敏感信息已做脱敏处理,可直接根据实际环境修改路径与域名后使用。

# ========== HTTP 80端口配置 ==========

# 旧域名统一跳转主站
server {
    listen 80;
    server_name www.old-domain.com old-domain.com alias-domain.com;
    location ~ /\.well-known {
        allow all;
    }
    return 301 https://main-domain.com$request_uri;
}

# 独立域名跳转自身HTTPS
server {
    listen 80;
    server_name sub.main-domain.com;
    location ~ /\.well-known {
        allow all;
    }
    return 301 https://sub.main-domain.com$request_uri;
}

# ========== HTTPS 443端口配置 ==========

# 旧域名HTTPS跳转主站
server {
    listen 443 ssl http2;
    server_name www.old-domain.com old-domain.com alias-domain.com;
    ssl_certificate    /path/to/cert/fullchain.pem;
    ssl_certificate_key    /path/to/cert/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:!MD5;
    ssl_prefer_server_ciphers on;
    ssl_session_tickets on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    add_header Strict-Transport-Security "max-age=31536000";
    return 301 https://main-domain.com$request_uri;
}

# 主站与独立域名业务逻辑
server {
    listen 443 ssl http2;
    server_name main-domain.com sub.main-domain.com;
    root /path/to/wwwroot;
    index index.php index.html index.htm;
    
    ssl_certificate    /path/to/cert/fullchain.pem;
    ssl_certificate_key    /path/to/cert/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:!MD5;
    ssl_prefer_server_ciphers on;
    ssl_session_tickets on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    add_header Strict-Transport-Security "max-age=31536000";
    
    location / {
        try_files $uri $uri/ /index.php?$args;
    }
    
    location ~ \.php$ {
        try_files $uri /index.php?$args;
        fastcgi_pass unix:/path/to/php-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

五、配置后各域名访问行为对照

修改完成后,各域名的响应逻辑如下:

  • http://old-domain.com → 301跳转至 https://main-domain.com

  • https://www.old-domain.com → 301跳转至 https://main-domain.com

  • http://sub.main-domain.com → 301跳转至 https://sub.main-domain.com

  • https://sub.main-domain.com直接访问,不跳转

  • https://main-domain.com → 直接访问

六、关键注意事项

  • SSL证书匹配:独立域名必须包含在当前证书文件内,否则浏览器会报证书域名不匹配错误。建议使用多域名证书(SAN证书)或单独为独立域名申请证书。

  • 301权重集中:跳转务必使用301永久重定向,这样才能将旧域名的SEO权重有效传递至主站。

  • 配置验证:修改Nginx配置后,务必执行 nginx -t 检查语法,确认无误后再执行 nginx -s reload 生效。

  • 日志切割:若独立域名与主站共用根目录,建议检查日志配置是否满足独立域名的分析需求。

七、总结

通过拆分HTTP与HTTPS的server块,并精确控制 server_name 的域名列表,可以灵活实现Nginx多域名环境下的"部分跳转、部分独立"需求。该方案既保证了旧域名的SEO权重集中,又满足了特定域名的独立业务访问需求,是网站多域名管理中的常用最佳实践。

网友评论

访客信息

你已经3分钟没有访问该网站

这些可能是你需要的内容: