直接用rewritecond匹配user-agent字符串或正则,配合[nc]忽略大小写,再用rewriterule返回403或跳转;关键在写准条件、转义特殊字符、正确使用逻辑连接符。

直接用 RewriteCond %{HTTP_USER_AGENT} 匹配字符串或正则,配合 [NC] 忽略大小写,再用 RewriteRule 返回 403 或跳转即可。关键在写准条件、转义特殊字符、逻辑连接符别用错。
基础写法:匹配空 UA 或常见恶意爬虫
这是最常用也最安全的起点,误伤率极低:
- 屏蔽空 User-Agent(脚本、低级扫描器常用):
RewriteCond %{HTTP_USER_AGENT} ^$ [NC]<br>RewriteRule ^ - [F] - 屏蔽一批已知垃圾 UA(用竖线
|表示“或”,注意转义点号和括号):RewriteCond %{HTTP_USER_AGENT} "(FeedDemon|AhrefsBot|MJ12bot|ZmEu|Python-urllib|HttpClient|Wfuzz|Fuzz|buster)" [NC]<br>RewriteRule ^ - [F]
进阶技巧:精准识别与避免误判
单纯靠 UA 字符串容易误拦正常用户,加一层判断更稳妥:
图像生成代理:由Google Gemini驱动的图像生成工具(Nano Banana / Gemini 2.5 & 3 Flash Image)。用于根据文本提示生成图像。
- 用
!否定条件,比如只对 iOS 且非微信环境生效:RewriteCond %{HTTP_USER_AGENT} "iPhone|iPad" [NC]<br>RewriteCond %{HTTP_USER_AGENT} !MicroMessenger [NC]<br>RewriteRule ^$ /pwa-home.html [L] - 多个 UA 条件要用
[OR]显式声明“或”,否则默认是“且”:RewriteCond %{HTTP_USER_AGENT} "MSIE [6-9]" [NC,OR]<br>RewriteCond %{HTTP_USER_AGENT} "Trident.*rv:11" [NC]<br>RewriteRule ^ /ie-unsupported.html [R=302,L] - 匹配 Chrome 但排除安卓版(防误伤移动 Chrome):
RewriteCond %{HTTP_USER_AGENT} "Chrome" [NC]<br>RewriteCond %{HTTP_USER_AGENT} !Android [NC]<br>RewriteRule ^ /desktop-only.php [L]
实用建议:部署前必须检查的点
规则写得再好,配置不当也会失效或报错:
- 确保
mod_rewrite已启用:
Debian/Ubuntu 执行sudo a2enmod rewrite;RHEL/CentOS 检查httpd.conf中LoadModule rewrite_module是否启用 -
.htaccess生效需目录允许重写:
对应<directory></directory>块中要有AllowOverride All或至少AllowOverride FileInfo - 所有
RewriteRule后建议加[L]终止,防止后续规则干扰;返回禁止用[F],跳转明确写[R=302,L]或[R=301,L] - 正则里点号
.、星号*、括号()、竖线|都要加反斜杠转义,除非你真需要它们的正则含义
替代方案:用 SetEnvIf 更轻量(适合简单子串匹配)
如果只是黑名单关键词、不涉及复杂正则,SetEnvIf 更简洁稳定,不易因正则错误导致 500:
SetEnvIfNoCase User-Agent "(FeedDemon|AhrefsBot|ZmEu)" BADBOT<br>Order Allow,Deny<br>Allow from all<br>Deny from env=BADBOT
- 它不依赖 mod_rewrite,语法更接近字符串匹配,适合批量屏蔽场景










