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

Nginx服务器块配置问题:主域名与子域名分别对应不同网站目录

Nginx服务器块配置问题:主域名与子域名分别对应不同网站目录

嘿,看起来你已经搭好了基础配置,但咱们可以调整得更规范,还能避开一些Nginx里的小坑。我来帮你优化一下,确保主域名和子域名各自精准指向目标目录,同时让跳转规则更可靠。

首先先明确你的核心需求:

  • 主域名project-freedom.net(含www)指向/var/www/html
  • 子域名forum.project-freedom.net指向/var/www/forum

先说说你原配置里的几个可以优化的点:

  1. 混合监听HTTP和HTTPS端口在同一个server块里,再用if指令做跳转,容易触发Nginx的一些意外行为(Nginx里的if是出了名的“坑多”,能不用就不用)
  2. 主域名配置里的location /forum块其实是多余的——根据你的需求,你要的是子域名对应论坛目录,而非主域名下的/forum子路径,留着反而可能造成混淆

下面是优化后的完整配置,我分块给你解释:

第一步:处理所有HTTP请求,统一跳转到HTTPS

把HTTP跳转单独拆出来,结构更清晰,也避免了if指令的使用:

# 主域名HTTP跳转:无论访问project-freedom.net还是www.project-freedom.net,都跳转到HTTPS的www版本
server {
    listen 80;
    listen [::]:80;
    server_name project-freedom.net www.project-freedom.net;
    return 301 https://www.project-freedom.net$request_uri;
}

# 子域名HTTP跳转:访问forum.project-freedom.net的HTTP版本,跳转到HTTPS
server {
    listen 80;
    listen [::]:80;
    server_name forum.project-freedom.net;
    return 301 https://forum.project-freedom.net$request_uri;
}

第二步:主域名HTTPS配置(指向/var/www/html)

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name www.project-freedom.net;

    # SSL证书配置,确保证书包含主域名和www子域名
    ssl_certificate /etc/ssl/certs/1546559737repl_1.crt;
    ssl_certificate_key /etc/ssl/private/project-freedom.key;

    # 主站根目录
    root /var/www/html;
    index index.html index.htm index.nginx-debian.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

第三步:子域名forum的HTTPS配置(指向/var/www/forum)

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name forum.project-freedom.net;

    # 用同一个SSL证书,这里要确认你的证书包含forum.project-freedom.net这个子域名
    ssl_certificate /etc/ssl/certs/1546559737repl_1.crt;
    ssl_certificate_key /etc/ssl/private/project-freedom.key;

    # 论坛根目录
    root /var/www/forum;
    index index.php index.html index.htm;

    # 适配PHP论坛的URL重写规则,比如Discuz、phpBB这类程序都需要这个
    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    # PHP处理配置,注意确认你的PHP版本对应的socket路径是否正确(这里是php7.4)
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    }
}

最后几个注意事项:

  • 务必确认你的SSL证书包含forum.project-freedom.net,否则子域名的HTTPS会出现证书错误;如果原证书只覆盖主域名,需要申请包含子域名的SAN证书或者通配符证书
  • 修改配置后,记得执行sudo nginx -t检查配置语法是否正确,没问题再执行sudo systemctl reload nginx生效配置
  • 如果你的PHP版本不是7.4,要对应修改fastcgi_pass里的socket路径(比如php8.0就是/var/run/php/php8.0-fpm.sock)

备注:内容来源于stack exchange,提问作者Michael Griffith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 15:48:07