如何用htaccess实现非指定域名来源时阻止特定查询字符串?
解决.htaccess限制非允许域名访问特定操作的问题
让我来帮你调整这个配置,先分析下你现有规则的问题,再给出修正方案:
你的原配置存在的问题
- 未处理空Referer场景:当用户直接输入URL访问(或某些工具发起请求)时,
HTTP_REFERER会为空,这时候你的!domain1\.com这类条件会匹配空字符串,导致误拦截这类合法请求。 - 域名匹配不精确:你的正则没有锚定域名的开头,可能会出现意外匹配——比如如果某个恶意Referer里包含
domain1.com的片段(比如http://hacker.com/xxxdomain1.com),会被误判为合法来源。
修正后的配置
RewriteEngine On # 定义允许的来源:空Referer(可选)或指定域名(支持http/https、带/不带www,不区分大小写) RewriteCond %{HTTP_REFERER} ^$ [OR] RewriteCond %{HTTP_REFERER} ^https?://(www\.)?domain1\.com/ [NC,OR] RewriteCond %{HTTP_REFERER} ^https?://(www\.)?domain2\.com/ [NC,OR] RewriteCond %{HTTP_REFERER} ^https?://(www\.)?domain3\.com/ [NC] # 符合上述条件则跳过后续规则,允许访问 RewriteRule ^ - [L] # 非允许来源时,检查是否是特定操作(action=view) RewriteCond %{QUERY_STRING} ^action=view$ [NC] # 返回403禁止访问 RewriteRule .* - [F,L]
配置说明
- 允许的来源规则:
^$匹配空Referer,如果你不想允许直接输入URL访问action=view,可以去掉这一行和后面的[OR]。^https?://匹配http或https协议;(www\.)?可选匹配www前缀;[NC]表示不区分域名大小写(比如Domain1.com也会被认可);结尾的/确保匹配的是域名根路径开始的请求。[L]标记表示如果匹配成功,就停止执行后续的Rewrite规则,直接允许访问。
- 禁止规则:
^action=view$精确匹配Query String,避免误匹配类似action=view&other=xxx的请求;[NC]同样支持大小写不敏感。[F]返回403 Forbidden状态码,[L]停止后续规则。
注意事项
HTTP_REFERER是可以被伪造的,这个方案只能作为基础的访问限制,不能完全阻止恶意请求。- 确保你的服务器已经开启了
mod_rewrite模块,否则规则不会生效。
内容的提问来源于stack exchange,提问作者Laurentiu
相关产品推荐
相关产品推荐

