我有一台机器,我租用了一个IP地址,该IP地址必须先前已分配给某种链接垃圾邮件公司。该公司有数百个域仍然可以解析我的服务器的IP地址,谷歌等不断尝试用他们的机器人(数十万页)索引该网站。我没有成功地让链接垃圾邮件发送者更改他们的DNS记录以在其他地方解决。精细。
我决定使用mod_rewrite以相当直接的方式处理这个问题:我希望任何不包含我的域名的请求返回410,除非请求是/robots.txt
。对于机器人文件,我想返回一个简单的文件,不允许200的所有内容。根据我的想法,我可以快速熄灭机器人并恢复正常。
我的mod_rewrite配置如下所示:
RewriteEngine On
RewriteCond %{HTTP_HOST} !^.*foo\.com$
RewriteRule ^/robots\.txt$ /robots-off.txt [L]
RewriteCond %{HTTP_HOST} !^.*foo\.com$
RewriteRule !^/robots\.txt$ - [G]
我可能在此IP上托管的所有域都位于foo.com
域下/的某个位置。因此,我希望第一条规则告诉Apache在/robots-off.txt
为除我自己以外的任何域提出请求时,输出/robots.txt
的内容为200。
可悲的是,正在发生的事情是每个请求都会产生410,因此机器人永远不会有机会了解为什么他们应该停止索引整个网站。以下是查询错误主机时的响应:
The requested resource<br />/robots-off.txt<br />
is no longer available on this server and there is no forwarding address.
Please remove all references to this resource.
这已经持续了一个多星期,看不到尽头。第一条规则正在运行,但[L]似乎被忽略,然后运行第二条规则。我不明白为什么。
答案 0 :(得分:0)
好的,我误解了[L]是如何工作的。见这里:mod_rewrite seems to ignore [L] flag
工作代码如下所示:
RewriteCond %{HTTP_HOST} !^.*foo\.com$
RewriteRule ^robots\.txt$ /robots-off.txt [L]
RewriteCond %{HTTP_HOST} !^.*foo\.com$
RewriteRule !^robots-off\.txt$ - [L,G]
希望这有助于某人。
答案 1 :(得分:0)
有点晚了,但这会返回重定向到浏览器,然后浏览器会重新请求robots-off.txt这将是一个新请求,因此再次被重写。但是,如果你进行了直接操作,那么apache将返回内联的最终文件,因此没有新的请求,并且最后的内容会以你期望的方式得到尊重。
RewriteCond %{HTTP_HOST} !^.*foo\.com$
RewriteRule ^robots\.txt$ /robots-off.txt [PT,L]
RewriteCond %{HTTP_HOST} !^.*foo\.com$
RewriteRule !^robots-off\.txt$ - [L,G]