如何在.htaccess中检测完整的HTTP_REFERER字符串
在.htaccess中检测完整HTTP_REFERER(含查询参数)的解决方案
你遇到的问题核心是正则匹配规则的写法问题——浏览器发送的HTTP_REFERER确实包含完整的URL(包括查询参数),但需要正确编写正则表达式来匹配完整字符串。
具体实现规则
启用mod_rewrite后,通过RewriteCond精准匹配带查询参数的完整referer:
RewriteEngine On # 允许来自firstdomain.org指定完整referer的请求 RewriteCond %{HTTP_REFERER} ^https://firstdomain\.org/index\.php\?r=something&cguid=[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$ [NC] RewriteRule ^ - [L] # 拒绝非指定来源的请求(可选,根据实际需求调整) RewriteCond %{HTTP_REFERER} !^https://firstdomain\.org/index\.php\?r=something&cguid=[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$ [NC] RewriteCond %{HTTP_REFERER} !^$ RewriteRule ^ - [F]
关键注意事项
- 特殊字符转义:正则中的
.、?、&属于特殊元字符,必须用反斜杠\转义,否则会被正则引擎解析为通配符或逻辑符号,导致匹配失败。 - 精准匹配UUID格式:示例中用
[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}精准匹配UUID格式的cguid参数,如果你不需要这么严格,也可以简化为[a-f0-9-]+匹配任意由字母、数字和连字符组成的cguid值。 - 灵活匹配调整:如果
r参数的值不固定,只需要确保referer包含cguid参数,可将正则调整为:RewriteCond %{HTTP_REFERER} ^https://firstdomain\.org/index\.php\?.*cguid=[a-f0-9-]+.*$ [NC] - 模块启用确认:确保服务器已经启用mod_rewrite模块,否则规则不会生效。
内容的提问来源于stack exchange,提问作者gilbertdelyon
相关产品推荐
相关产品推荐

