如何用.htaccess结合gethostbyname()重定向特定域名服务器流量?
特定域名来源流量的.htaccess重定向/封禁方案
问题根源
- 直接用
deny封禁IP导致自身出现403,大概率是对方域名和你的域名解析到同一服务器IP,封禁IP会连带拦截自己的请求 - 基于Referer的规则不可靠:请求可以不带Referer,或者被伪造,容易误封正常访问
- 基于HTTP_HOST的规则针对的是用户访问时输入的域名,而非发起请求的服务器域名,对重定向过来的流量无效
有效解决方案:通过反向DNS匹配来源服务器域名
Apache的%{REMOTE_HOST}变量可获取客户端IP对应的反向DNS主机名,利用这个能精准匹配来自特定域名服务器的流量。
完整.htaccess代码(重定向到你的域名)
RewriteEngine On # 匹配来源主机名是baddomain.com或其子域名的请求 RewriteCond %{REMOTE_HOST} ^(.*\.)?baddomain\.com$ [NC] # 永久重定向到你的目标域名,请替换成实际域名 RewriteRule ^(.*)$ https://yourdomain.com/$1 [L,R=301]
封禁替代方案(无需重定向,直接拦截)
将上述代码中的RewriteRule替换为:
RewriteRule .* - [F,L]
关键注意事项
- 开启反向DNS:确保服务器的Apache配置中
HostnameLookups设置为On或Double(多数主机商默认开启,若无效可联系主机服务商确认) - 精准匹配调整:若只需匹配主域名
baddomain.com,去掉规则中的(.*\.)?,改为^baddomain\.com$ - IP批量匹配方案(反向DNS不可用)
如果无法开启反向DNS,先通过nslookup baddomain.com或dig baddomain.com获取对方所有IP,再批量匹配:
RewriteEngine On # 替换为实际查询到的baddomain.com的IP列表 RewriteCond %{REMOTE_ADDR} ^1\.2\.3\.4$ [OR] RewriteCond %{REMOTE_ADDR} ^5\.6\.7\.8$ RewriteRule ^(.*)$ https://yourdomain.com/$1 [L,R=301]
内容的提问来源于stack exchange,提问作者user22294749
相关产品推荐
相关产品推荐

