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

Nginx多站点HTTP跳转异常求助:81/82端口跳转至80站点

问题原因分析

你的重定向错误根源在于Nginx配置的两处核心问题:

  1. listen指令语法错误:Nginx不支持用or分隔端口,这种写法会导致监听规则失效,所有HTTP请求可能匹配到默认或错误的server块。
  2. 未区分域名的通用配置:单一的server_name subdomain.site.com无法识别不同请求的域名,重定向时$server_name会使用配置中的固定值,而非请求实际的Host头,导致所有非port80的HTTP请求都被重定向到第一个匹配的域名。
解决方案

方案一:通用HTTP重定向块(推荐)

创建一个监听所有HTTP端口的server块,利用$host变量自动匹配请求的域名,确保重定向到对应HTTPS地址:

server {
    listen 80;
    listen 81;
    listen 82;
    server_name port80.site.com port81.site.com port82.site.com;
    return 301 https://$host$request_uri;
}

然后为每个域名配置独立的HTTPS server块,确保server_name和证书路径正确:

# port80.site.com HTTPS配置
server {
    listen 443 ssl http2;
    server_name port80.site.com;

    root /var/www/port80-site;
    index index.php;

    ssl_certificate /etc/letsencrypt/live/port80.site.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/port80.site.com/privkey.pem;

    client_max_body_size 100m;
    client_body_timeout 120s;
    sendfile off;

    ssl_session_cache shared:SSL:10m;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
    ssl_prefer_server_ciphers on;

    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Robots-Tag none;
    add_header Content-Security-Policy "frame-ancestors 'self'";
    add_header X-Frame-Options DENY;
    add_header Referrer-Policy same-origin;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/run/php/php8.1-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param PHP_VALUE "upload_max_filesize = 100M \n post_max_size=100M";
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param HTTP_PROXY "";
        fastcgi_intercept_errors off;
        fastcgi_buffer_size 16k;
        fastcgi_buffers 4 16k;
        fastcgi_connect_timeout 300;
        fastcgi_send_timeout 300;
        fastcgi_read_timeout 300;
    }

    location ~ /\.ht {
        deny all;
    }
}

# port81.site.com HTTPS配置(复制上述结构,修改server_name、root和证书路径)
server {
    listen 443 ssl http2;
    server_name port81.site.com;

    root /var/www/port81-site;
    index index.php;

    ssl_certificate /etc/letsencrypt/live/port81.site.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/port81.site.com/privkey.pem;

    # 其余通用配置(client_max_body_size、SSL设置、headers、PHP处理等)与上述一致
}

# port82.site.com HTTPS配置(同理修改对应参数)
server {
    listen 443 ssl http2;
    server_name port82.site.com;

    root /var/www/port82-site;
    index index.php;

    ssl_certificate /etc/letsencrypt/live/port82.site.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/port82.site.com/privkey.pem;

    # 其余通用配置与上述一致
}

方案二:独立域名HTTP重定向块

如果需要更精细的端口控制,可为每个域名单独配置HTTP重定向:

# port80.site.com HTTP重定向
server {
    listen 80;
    server_name port80.site.com;
    return 301 https://$server_name$request_uri;
}

# port81.site.com HTTP重定向
server {
    listen 81;
    server_name port81.site.com;
    return 301 https://$server_name$request_uri;
}

# port82.site.com HTTP重定向
server {
    listen 82;
    server_name port82.site.com;
    return 301 https://$server_name$request_uri;
}

HTTPS部分配置与方案一一致。

生效步骤
  1. 执行nginx -t检查配置语法是否正确
  2. 执行systemctl reload nginx重启Nginx使配置生效

关于Cloudflare:由于未开启代理,只需确保三个域名的A记录均正确指向服务器IP即可,无需额外调整Cloudflare设置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 05:55:17