如何通过Nginx配置实现子域名掩码,隐藏浏览器地址栏子域名
实现方案
你当前使用的307客户端重定向规则会触发浏览器地址栏自动更新为子域名,是跳转后地址变化的核心原因。要实现子域名掩码效果(地址栏始终保留主域名,移动端服务正常响应),只需取消客户端跳转逻辑,改为服务端内部根据UA将请求转发到移动端上游服务即可。
具体修改步骤
- 调整主域名443端口server块的匹配逻辑,移除307跳转规则,改为内部代理
- 按需设置代理请求的Host头,保证移动端服务能正常识别请求
- 可选:限制mobile.mydomain公网访问权限,避免用户直接访问子域名
修改后的配置示例
server { listen 80; server_name mydomain; return 301 https://$server_name$request_uri; } include mime.types; server { listen 443 ssl; server_name mydomain; ssl_certificate /etc/ssl/CA_Bundle.ca-bundle; ssl_certificate_key /etc/ssl/2021/server.key; location / { add_header Access-Control-Allow-Origin *; proxy_redirect off; expires off; set $agentflag 0; set $upstream_addr http://172.17.0.1:8080; set $upstream_host $host; if ( $http_user_agent ~* "(Mobile)" ){ set $agentflag 1; } if ($request_uri ~ "user-agent"){ set $agentflag 0; } if ( $agentflag = 1 ) { rewrite ^/(.*)/$ /$1 break; # 内部重写,不触发客户端跳转 set $upstream_addr http://172.17.22.1:8081; # 若移动端服务需要绑定Host为mobile.mydomain则取消下一行注释 # set $upstream_host mobile.mydomain; } proxy_set_header Host $upstream_host; proxy_pass $upstream_addr; # 若移动端服务存在返回Location指向子域名的情况,添加以下规则改写跳转 # proxy_redirect https://mobile.mydomain/ /; } } # 若不再需要对外暴露mobile.mydomain,可删除以下两个server块,或添加访问限制 server { listen 80; server_name mobile.mydomain; return 301 https://mydomain$request_uri; # 改为跳转到主域名,避免用户直接访问子域名 } include mime.types; server { listen 443 ssl; server_name mobile.mydomain; ssl_certificate /etc/ssl/CA_Bundle.ca-bundle; ssl_certificate_key /etc/ssl/2021/server.key; return 301 https://mydomain$request_uri; # 所有子域名请求都跳转到主域名 }
注意事项
- 如果移动端应用内存在写死的
mobile.mydomain静态资源引用,可以使用Nginx的sub_filter模块批量替换响应内容中的子域名为主域名 - 若需要区分PC和移动端请求的缓存,可以在缓存规则中加入
$agentflag作为缓存key的一部分
内容的提问来源于stack exchange,提问作者shufilkhan
相关产品推荐
相关产品推荐

