Nginx如何将admin子域名重定向至www,排除含wp-admin的路径请求
问题核心原因
你编写的规则无法生效的根本原因:rewrite 指令的正则匹配范围是请求的URI路径部分,不会匹配域名(Host头部),所以你试图在路径中匹配admin子域名的逻辑本身就不成立。
正确配置实现
方案1:拆分server块(最推荐,性能最优、逻辑清晰)
Nginx官方推荐使用不同server块处理不同子域名,逻辑拆分最清晰,性能也远高于正则判断:
# admin子域名专属server块 server { listen 443 ssl; server_name admin.domainname.com; # 替换为你实际的SSL证书配置 ssl_certificate /path/to/your/cert.pem; ssl_certificate_key /path/to/your/key.pem; # 匹配wp-admin开头的请求,直接正常处理不跳转 location ^~ /wp-admin/ { # 此处填写和www站点一致的站点配置,比如根目录、索引、PHP处理规则等 root /path/to/your/site/root; index index.php index.html; # PHP站点示例配置,非PHP站点可删除 location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } # 其他所有请求重定向到www子域名,保留完整URI和查询参数 location / { return 301 https://www.domainname.com$request_uri; } } # 原有www子域名的server块保持不变即可 server { listen 443 ssl; server_name www.domainname.com; # 原有配置无需修改 }
方案2:单server块兼容(适合不方便拆分server块的场景)
如果需要把两个子域名的配置放在同一个server块中,可以通过判断Host头实现需求:
server { listen 443 ssl; server_name admin.domainname.com www.domainname.com; # 通用的SSL、根目录、索引等基础配置 # 只有admin子域名的非wp-admin路径才触发跳转 if ($host = 'admin.domainname.com') { set $redirect_rule 1; } if ($request_uri ~ ^/wp-admin/) { set $redirect_rule 0; } if ($redirect_rule = 1) { return 301 https://www.domainname.com$request_uri; } # 下方保留原有站点的其他配置即可 }
上述写法已经规避了Nginx if指令的常见陷阱,可正常使用
配置验证
修改配置后执行nginx -t检查语法是否正确,确认无误后执行nginx -s reload重载配置生效,可通过curl命令测试规则:
- 普通路径测试:
curl -I https://admin.domainname.com/test-slug应返回301状态码,Location头为https://www.domainname.com/test-slug - wp-admin路径测试:
curl -I https://admin.domainname.com/wp-admin/test应返回正常业务状态码,不会出现301跳转
内容的提问来源于stack exchange,提问作者nico_lrx
相关产品推荐
相关产品推荐

