Nginx 实现移动端差异化 HTTPS 重定向需分三步:一是用正则 ~* "(Mobile|Android|iPhone|iPad|...) 精准识别 UA 并在 443 server 块中执行 302 跳转至 https://m.example.com$request_uri;二是单独配置 80 端口 server 块,对桌面端无条件 301 跳转 HTTPS;三是通过 ?desktop=1 参数轻量绕过跳转,避免误判与权重流失。

要让 Nginx 针对移动端 UA 实现差异化的 HTTPS 重定向,核心不是“统一跳转”,而是按设备类型做**有区分、有边界、有安全兜底**的处理。关键在于:移动端访问 PC 域名时跳转到手机站(HTTPS),而桌面端必须强制走 HTTPS,且两者不能互相干扰或误判。
识别移动端 UA 要精准,不漏不滥
仅靠 Mobile 字段会误伤 Chrome 模拟器或部分桌面浏览器;完全忽略 iPad 又会让大量平板用户停留在 PC 页面。推荐使用已验证的正则表达式:
if ($http_user_agent ~* "(Mobile|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini)") { ... }- 它覆盖主流移动系统与常见 UA 变体,大小写不敏感,且不含易冲突的泛匹配词(如
Touch或Tablet) - 注意:该判断必须放在
server块内、location外,否则可能被 location 优先级覆盖
PC 域名 → 移动端域名:用 302 保留路径,禁用 301
当用户用手机访问 www.example.com/product?id=123,应跳转至 https://m.example.com/product?id=123,而非丢参数或改协议再跳转。
- 使用
return 302 https://m.example.com$request_uri;——$request_uri包含完整路径和查询参数 - 绝对不要用
301:搜索引擎可能将 m.example.com 当作主站索引,导致 PC 站权重流失 - 确保
m.example.com已配置有效 SSL 证书,否则跳转后页面将显示证书错误
桌面端流量必须强制 HTTPS,且不参与移动端逻辑
桌面用户访问 http://www.example.com 或 http://example.com,应无条件 301 跳转到 https://www.example.com,且这个过程不能受 UA 判断影响。
- 单独配一个监听 80 端口的 server 块:
server { listen 80; server_name www.example.com example.com; return 301 https://$server_name$request_uri; } - UA 判断只用于“HTTPS 下的跨域跳转”,即只在
listen 443 ssl的 server 块中生效 - 避免把
if写在全局或错误作用域,Nginx 官方明确提示if在 location 外使用有风险,但此处是标准且安全的 UA 检测场景
绕过跳转的机制要轻量可控
用户点击“电脑版”链接后,需临时跳回 PC 域名,且后续请求不再触发跳转。可通过 URL 参数标记实现:
- 在跳转逻辑中加入开关判断:
if ($args ~* "desktop=1") { set $skip_mobile_redirect "1"; } - 再配合:
if ($http_user_agent ~* "..." ) { if ($skip_mobile_redirect != "1") { return 302 https://m.example.com$request_uri; } } - 这样既不用设 Cookie,也不依赖后端,纯 Nginx 层完成,CDN 也能透传参数











