Apache如何配置仅允许主流标准浏览器发起的HTTP请求访问
常规实现思路
别搞那些花里胡哨的浏览器指纹、多请求头联合校验,直接通过请求头里的User-Agent(简称UA)字段判断即可,完全满足无防破解要求、便捷可用的场景。主流浏览器的默认UA都有固定的专属标识,而命令行工具、非浏览器HTTP客户端的默认UA特征非常明显,很容易区分。
识别规则
可放行的主流浏览器UA核心特征
只要UA命中以下任意一个特征,就判定为来自主流标准浏览器:
- Mozilla Firefox:UA包含
Firefox/字段 - Google Chrome:UA包含
Chrome/字段 - 新版MS Edge(Chromium内核):UA包含
Edg/字段 - Apple Safari:UA包含
Safari/字段(Chrome、Edge等Chromium系浏览器为了兼容也会带这个字段,不影响判定,本身这类浏览器就在放行范围内)
直接拦截的非浏览器请求典型特征
命令行工具、通用HTTP客户端的默认UA基本不会携带上述浏览器专属标识,常见的默认UA标记包括:
- 命令行类:
curl/、Wget/、HTTPie/ - 客户端工具类:
PostmanRuntime/、python-requests/、Go-http-client/、Java/
服务端配置示例
Apache 配置
和参考逻辑框架完全匹配,直接在站点配置文件或者.htaccess中加入如下规则即可:
<If "%{HTTP_USER_AGENT} !~ /(Firefox\/|Chrome\/|Edg\/|Safari\/)/"> Require all denied </If>
Nginx 配置
在站点对应的server/location块中加入如下规则:
if ($http_user_agent !~* "(Firefox/|Chrome/|Edg/|Safari/)") { return 403; }
注意事项
- 该方案仅做常规流量拦截,不具备防UA伪造能力,符合需求中“无需防破解、便捷可用”的要求
- 如果业务存在自研客户端、特殊工具主动伪造浏览器UA的场景,这个方案不会拦截,可按需追加额外校验规则
- 不用额外引入Sec-Fetch头、Accept头校验之类的复杂逻辑,UA判断已经足够覆盖绝大多数常规非浏览器默认请求场景,维护成本最低
内容的提问来源于stack exchange,提问作者Lokomotywa
相关产品推荐
相关产品推荐

