Nginx服务器块配置问题:主域名与子域名分别对应不同网站目录
Nginx服务器块配置问题:主域名与子域名分别对应不同网站目录
嘿,看起来你已经搭好了基础配置,但咱们可以调整得更规范,还能避开一些Nginx里的小坑。我来帮你优化一下,确保主域名和子域名各自精准指向目标目录,同时让跳转规则更可靠。
首先先明确你的核心需求:
- 主域名
project-freedom.net(含www)指向/var/www/html - 子域名
forum.project-freedom.net指向/var/www/forum
先说说你原配置里的几个可以优化的点:
- 混合监听HTTP和HTTPS端口在同一个server块里,再用
if指令做跳转,容易触发Nginx的一些意外行为(Nginx里的if是出了名的“坑多”,能不用就不用) - 主域名配置里的
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
相关产品推荐
相关产品推荐

