如何配置Nginx将子域名portfolio.jamelaumn.com重定向至localhost/portfolio
Nginx子域名定向到指定路径配置方案
需求
访问portfolio.jamelaumn.com时,将请求转发到本地服务的/portfolio路径,当前Nginx配置如下:
server { listen 80; server_name jamelaumn.com *.jamelaumn.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name jamelaumn.com *.jamelaumn.com; ssl_certificate /etc/letsencrypt/live/jamelaumn.com-0001/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/jamelaumn.com-0001/privkey.pem; location /static/ { alias /home/jamelaumn/myproject/deploystatic/; } location /media/ { alias /home/jamelaumn/myproject/media/; } location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
解决方法
要实现这个需求,核心是利用Nginx精确域名匹配优先级高于通配符的规则,在现有配置前添加针对portfolio.jamelaumn.com的独立server块,具体修改如下:
1. 处理HTTP(80端口)请求
在原有80端口的通配符server块之前,添加单独的HTTP跳转规则,把HTTP请求转成HTTPS并修正路径:
server { listen 80; server_name portfolio.jamelaumn.com; # 跳转到HTTPS的对应路径,保留原请求参数 return 301 https://$server_name/portfolio$request_uri; }
2. 处理HTTPS(443端口)请求
同样在原有443端口的通配符server块之前,添加精确匹配的HTTPS代理配置,直接将请求转发到本地/portfolio路径:
server { listen 443 ssl; server_name portfolio.jamelaumn.com; # 复用原有SSL证书 ssl_certificate /etc/letsencrypt/live/jamelaumn.com-0001/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/jamelaumn.com-0001/privkey.pem; # 复用原有静态资源规则(如果portfolio有独立静态资源可单独配置) location /static/ { alias /home/jamelaumn/myproject/deploystatic/; } location /media/ { alias /home/jamelaumn/myproject/media/; } location / { # 将请求转发到本地服务的/portfolio路径,保留原请求参数 proxy_pass http://127.0.0.1:8000/portfolio$request_uri; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
3. 保留原有通配符配置
原有的两个通配符server块可以继续保留,用于处理主域名和其他子域名的请求。
关键注意事项
- 配置顺序很重要:精确匹配的server块必须放在通配符匹配的前面,否则Nginx会优先匹配通配符规则,导致新配置不生效。
- 验证配置并重启:修改完配置后,先执行
nginx -t检查语法是否正确,无误后执行systemctl reload nginx(或对应系统的重启命令)使配置生效。 - 路径拼接细节:如果不需要保留原请求的
$request_uri,可以把proxy_pass改成http://127.0.0.1:8000/portfolio/(记得加末尾的斜杠,避免路径拼接出错)。
内容的提问来源于stack exchange,提问作者Jamelaumn
相关产品推荐
相关产品推荐

