Nginx 层 Deep Link 重定向本质是识别 UA、协议、路径等特征并按规则跳转至客户端入口或降级页,不触发唤起逻辑,仅负责 HTTP 路由、兜底降级与参数透传。

直接在 Nginx 层做 Deep Link 重定向分发,本质是**识别请求来源(UA、协议、路径)并按规则跳转到对应客户端入口或降级页面**,但需明确:Nginx 本身不解析或触发 App 唤起逻辑,它只负责 HTTP 层的路由决策。真正的 Deep Link 唤起由客户端(iOS Universal Links / Android App Links)或前端 JS 触发,Nginx 的作用是精准分发、兜底降级、参数透传。
识别 Deep Link 请求特征
Deep Link 请求通常具备可辨识的 URL 结构或 UA 特征,Nginx 可据此分流:
-
协议前缀识别:如
myapp://、example://等自定义 scheme 无法被 Nginx 直接接收(浏览器不发这类请求),所以实际落地的是其 HTTP 化形式,例如:
–https://example.com/launch?deep=product/123
–https://example.com/app/product/123
–https://example.com/?dl=profile&uid=abc -
UA 辅助判断:原生 App 内 WebView 或 SDK 发起的请求常带定制 UA,如
MyApp/3.2.0 (Android; SM-G998B)或MyApp/4.1.0 (iOS; iPhone15,2);微信/QQ 内置浏览器则含MicroMessenger或QQBrowser -
Referer 或 Header 标识:广告平台或渠道 SDK 可能注入
X-Channel: facebook或Referer: https://fb.me/xxx,用于归因和跳转策略
配置分发逻辑:按场景路由
根据业务目标,选择以下一种或组合方式:
-
跳转至 App 协议(唤醒):对已安装用户返回
myapp://...,需前端 JS 配合尝试唤起(Nginx 不执行唤起,仅提供链接)location = /app/product {<br> return 302 "myapp://product/$arg_id";<br>} -
跳转至 Universal Link / App Links 入口页:iOS 用户访问
https://example.com/product/123,该页需满足 Apple 要求(apple-app-site-association文件 + HTTPS + 正确 TLS),Nginx 只需原样响应或加参数location ^~ /product/ {<br> try_files $uri /index.html;<br>} -
按 UA 分流到不同落地页:
if ($http_user_agent ~* "MyApp/(\d+\.\d+)") {<br> set $app_version $1;<br>}<br>if ($http_user_agent ~* "MicroMessenger") {<br> set $client_type "wechat";<br>}<br>location /deep/ {<br> if ($client_type = "wechat") { return 302 https://h5.example.com/wx/$args; }<br> if ($app_version) { return 302 https://app.example.com/deep/$args; }<br> return 302 https://h5.example.com/deep/$args;<br>}
关键增强与避坑点
确保分发可靠、不丢参、不误判:
-
保留原始参数:用
$args或$request_uri透传全部查询参数,避免丢失 utm_source、dl_path 等归因字段 - 区分安装态与未安装态?Nginx 做不了:设备是否安装 App 是客户端能力,Nginx 无感知。所谓“智能跳转”必须依赖前端 JS 尝试唤起 + setTimeout 降级,Nginx 只提供统一入口和降级页面
-
缓存需隔离:若启用
proxy_cache,务必在 cache key 中加入$http_user_agent和$arg_dl等变量,否则微信用户可能看到安卓用户的缓存页 -
HTTPS 强制与协议保持:Universal Links 要求 HTTPS,建议全站 301 强制 HTTPS,并在重定向中用
$scheme动态拼接,避免混合内容
兜底与监控建议
真实场景中,跳转失败很常见,Nginx 层可做基础兜底:
- 对所有
/deep/*请求,设置 5 秒后自动跳转 H5 页面(由前端控制,Nginx 不干预) - 记录 Deep Link 请求日志:
log_format deep_link '$remote_addr - $http_user_agent [$time_local] "$request" $status $args';,便于分析唤起成功率 - 配合前端埋点:Nginx 返回的页面应携带标准
data-deeplink="true"属性,供 JS 判断是否走唤起流程


















