移动端应通过302跳转至https://m.example.com并保留完整路径,避免301导致seo权重错配;桌面端仅做80→443的301跳转;需正确透传x-forwarded-proto头并支持desktop=1参数绕过移动端跳转。

移动端访问对 HTTPS 重定向配置特别敏感——一次多余的跳转、一个错用的 301、一段未适配的 UA 判断,都可能造成白屏、参数丢失、证书警告或 SEO 权重错配。优化核心不是“全站统一跳 HTTPS”,而是让不同设备走各自最短、最稳、最安全的路径。
移动端需走 302 跳转到独立域名
手机访问 www.example.com 时,应临时跳转到 https://m.example.com,而非强制改协议留在 PC 域名下。这是为了适配页面结构、交互方式与资源加载策略。
- 用 return 302,不是 301:避免搜索引擎把 m 站当主站索引,防止 PC 站权重流失
- 跳转目标必须含完整路径:https://m.example.com$request_uri,保留 query 参数和 hash
- UA 判断放在 listen 443 ssl 的 server 块内,且在 location 外;正则推荐:if ($http_user_agent ~* "(Mobile|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini)") { return 302 https://m.example.com$request_uri; }
- m.example.com 必须已部署有效 SSL 证书,否则跳过去直接报“您的连接不是私密连接”
桌面端走无条件 301 强制 HTTPS
PC 流量不参与 UA 判断,也不跳 m 站,只做一件事:从 HTTP → HTTPS,一步到位、不可绕过。
- 单独配置一个 listen 80 的 server 块,只做 301:return 301 https://$host$request_uri;
- 不要把 HTTP→HTTPS 和 www 强制合并写成多层 if,容易链式跳转;如需兼容非 www,可用 map 提前判断 host 后统一跳
- 禁止在 80 端口块里写 UA 判断——桌面用户不该被移动端逻辑干扰
避免重定向叠加与协议污染
移动端常见问题如 https:// → http://:443/ 或 https:// → https://www. → https://,本质是后端应用没收到原始协议信息,或 Nginx 未正确透传头。
- 反向代理场景(如 Ruoyi/Spring Boot)必须加:proxy_set_header X-Forwarded-Proto $scheme; 和 proxy_set_header X-Real-IP $remote_addr;
- 后端框架据此生成重定向地址,就不会拼出 http://xxx:443 这类错误 URL
- 检查响应头中 Location 字段是否出现两次以上 301;用 curl -I 测试真实跳转链路
加一层轻量绕过机制
用户点“电脑版”后,需要临时退出移动端跳转逻辑,且后续请求不再触发——不能靠 Cookie 或 Session,要简单可靠。
- 在跳转逻辑里加参数判断:if ($args ~* desktop=1) { break; }
- 链接写成 https://www.example.com/?desktop=1,Nginx 检测到该参数就跳过 UA 判断
- 前端点击“电脑版”时,用 JS 重定向并带 desktop=1,服务端无需改动











