在.htaccess中无法同时使用REQUEST_URI与HTTP_REFERER的问题求助
问题解决:Apache RewriteCond 组合不生效的原因及修正
你的Rewrite规则问题出在HTTP_REFERER条件的否定写法错误,导致两个条件的逻辑组合不符合预期。
错误原因
第二个RewriteCond里的^!https://example.org/*写法完全错误:
- 否定符号
!应该放在整个正则表达式的最前面,表示“不匹配该规则”,而不是写在正则内部 - 正则里的
^!会被解析为“匹配以!开头的Referer值”,这显然不是你要的逻辑
修正后的配置
RewriteEngine On # 匹配访问路径以/rosters开头 RewriteCond %{REQUEST_URI} ^/rosters # 匹配Referer不是以https://example.org/开头的请求(NC忽略大小写) RewriteCond %{HTTP_REFERER} !^https://example.org/ [NC] # 执行301重定向到指定页面 RewriteRule ^(.*)$ https://mypagesite.com/contact/ [R=301,L]
额外说明
处理空Referer的情况:如果用户直接在地址栏输入
/rosters(此时HTTP_REFERER为空),当前配置会触发重定向,因为空值不匹配^https://example.org/。如果不想对空Referer的请求重定向,需要添加额外条件:RewriteEngine On RewriteCond %{REQUEST_URI} ^/rosters RewriteCond %{HTTP_REFERER} .+ # 确保Referer不为空 RewriteCond %{HTTP_REFERER} !^https://example.org/ [NC] RewriteRule ^(.*)$ https://mypagesite.com/contact/ [R=301,L]测试建议:
- 用浏览器开发者工具的Network面板,查看请求的
Referer头是否正确 - 用curl命令快速验证:
# 来自example.org的请求,不应重定向 curl -I -H "Referer: https://example.org/test" https://your-domain.com/rosters # 来自其他域名的请求,应重定向 curl -I -H "Referer: https://other-site.com" https://your-domain.com/rosters # 无Referer的请求,按默认配置会重定向 curl -I https://your-domain.com/rosters
- 用浏览器开发者工具的Network面板,查看请求的
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

