一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Nginx 如何在 Nginx 中使用 Rewrite 模块配合条件判断实现客户端浏览器的精准甄别与跳转

时间:2026-08-06 13:59:00 编辑:袖梨 来源:一聚教程网

Nginx通过rewrite模块结合if判断,利用$http_user_agent变量正则匹配User-Agent字符串实现浏览器分流跳转;支持break(内部重写)、redirect(302)和permanent(301)等标志,可匹配、排除或分类处理不同浏览器请求。

在 Nginx 中,通过 rewrite 模块结合 if 判断实现浏览器甄别与跳转,核心是利用 $http_user_agent 变量匹配客户端 User-Agent 字符串,并触发重定向或内部路径改写。这不是“识别浏览器类型”本身,而是基于 UA 字符串做正则匹配后执行动作——简单、有效、无需额外模块。

识别常见浏览器并跳转不同页面

比如让 Chrome 用户访问 /chrome/,Safari 用户访问 /safari/,其他用户走默认路径。可直接在 serverlocation 块中写:

  1. if ($http_user_agent ~* "Chrome") { rewrite ^/(.*)$ /chrome/$1 break; }
  2. if ($http_user_agent ~* "Safari.*AppleWebKit") { rewrite ^/(.*)$ /safari/$1 break; }
  3. if ($http_user_agent ~* "Firefox") { rewrite ^/(.*)$ /firefox/$1 break; }

注意:~* 表示不区分大小写的正则匹配;break 阻止后续 rewrite 规则执行,适合 location 内使用;$1 是捕获的原始 URI 路径(如 /login/chrome/login)。

按浏览器类型做 302 临时跳转

若需让用户浏览器地址栏显示新地址(例如引导移动端用 Safari 打开特定页),用 redirectpermanent 标志:

  1. if ($http_user_agent ~* "Mobile.*Safari") { rewrite ^/(.*)$ https://m.example.com/$1?from=safari redirect; }
  2. if ($http_user_agent ~* "Edg/") { rewrite ^/old-page.html$ /edge-optimized.html permanent; }

这里 permanent 返回 301,利于 SEO;redirect 返回 302,适合测试或短期策略。跳转目标支持完整 URL,也支持相对路径。

排除特定浏览器,统一处理其余流量

有时只需对非主流浏览器做降级处理。可用否定匹配:

  1. if ($http_user_agent !~* "(Chrome|Firefox|Safari|Edg|Trident)") { rewrite ^/(.*)$ /legacy/$1 break; }

!~* 表示“不匹配”,括号内用 | 表示“或”。该规则会把所有非 Chrome/Firefox/Safari/Edge/IE 的请求,全部导向 /legacy/ 下的资源。注意:User-Agent 可被伪造,仅适用于非强安全场景。

配合 set 变量提升可读性与复用性

当逻辑变复杂(如多条件组合),建议先用 set 提取特征再判断:

  1. set $browser "unknown";
  2. if ($http_user_agent ~* "Chrome") { set $browser "chrome"; }
  3. if ($http_user_agent ~* "Firefox") { set $browser "firefox"; }
  4. if ($browser = "chrome") { rewrite ^/(.*)$ /optimized/$1 break; }

这样避免重复解析 UA 字符串,也便于后期扩展(比如加入版本判断:~* "Chrome/([0-9]+)" 捕获主版本号并存入变量)。

实际部署时,务必把这类 if 放在 serverlocation 块内,且不能嵌套。Nginx 不支持 else,多分支靠顺序 + 独立 if 实现。只要正则写准、flag 选对,浏览器分流跳转就非常轻量可靠。

热门栏目