如何用Nginx实现子域名请求转发至子目录且不修改浏览器URL
解决方案
你需要用Nginx的内部重定向/反向代理来实现,而不是会触发外部跳转的rewrite规则。以下分两种场景给出具体配置:
场景1:子域名与主域名部署在同一台服务器
如果主站点文件存放在/var/www/example.com,子目录subdomain的路径为/var/www/example.com/subdomain,可以用alias指令实现内部映射,浏览器地址栏不会改变:
server { listen 80; # 若启用HTTPS,添加以下配置 listen 443 ssl; server_name subdomain.example.com; # 替换为你的SSL证书路径(HTTPS场景必填) # ssl_certificate /path/to/ssl/cert.pem; # ssl_certificate_key /path/to/ssl/key.pem; location / { # 注意末尾的斜杠不能省略,否则路径拼接会出错 alias /var/www/example.com/subdomain/; # 根据站点类型设置默认索引文件 index index.html index.htm index.php; } # 若站点是PHP项目,需额外配置PHP解析规则 location ~ \.php$ { alias /var/www/example.com/subdomain/; fastcgi_pass unix:/run/php/php8.2-fpm.sock; # 替换为你的PHP-FPM路径 fastcgi_param SCRIPT_FILENAME $request_filename; include fastcgi_params; } }
场景2:子域名与主域名部署在不同服务器
如果主站点在另一台服务器上,用proxy_pass反向代理将子域名请求转发到主域名的子目录,同时保持地址栏不变:
server { listen 80; listen 443 ssl; server_name subdomain.example.com; # SSL证书配置(HTTPS场景必填) # ssl_certificate /path/to/ssl/cert.pem; # ssl_certificate_key /path/to/ssl/key.pem; location / { # 注意末尾的斜杠,确保路径正确拼接 proxy_pass https://example.com/subdomain/; # 传递必要请求头,保证主站点能正确处理请求 proxy_set_header Host example.com; 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; } }
你之前的配置无效原因
- 第一个配置用了
permanent参数,会触发301永久跳转,浏览器地址栏必然改变; - 第二个
rewrite规则仅做内部路径重写,但如果没有对应server块处理重写后的/subdomain路径,或是路径拼接错误,就无法正确映射内容。
内容的提问来源于stack exchange,提问作者Alex Sofonea
相关产品推荐
相关产品推荐

