如何使用robots.txt仅禁止子域?


10

我的代码库几种环境(活,分期,DEV)&子域(之间共享staging.example,dev.example等),并且只有两个应允许被抓取(即www.example和example)。通常,我会修改/robots.txt并添加Disallow: /,但是由于共享的代码库,我无法在/robots.txt不影响所有(子)域的情况下进行修改。

任何想法如何去做?

Answers:


13

您可以robots.txt基于通过其访问站点的子域提供其他文件。在Apache上执行此操作的一种方法是使用.htaccess中的mod_rewrite在内部重写URL。就像是:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^(www\.)?example\.com$ [NC]
RewriteRule ^robots\.txt$ robots-disallow.txt [L]

上述规定,对于所有请求robots.txt,其中主机是其他比什么www.example.com或example.com,然后在内部重写请求robots-disallow.txt。然后robots-disallow.txt将包含Disallow: /指令。

如果您的.htaccess文件中还有其他指令,则此指令将需要在任何路由指令之前靠近顶部。


我在想同样的解决方案。我不确定是否还有其他东西,但是到了最后,如果是这样,那将完成我的工作)
— alexus

1
如果两个子域/主机都指向完全相同的网站空间/代码库,那么robots.txt“标准”中没有任何内容可以控制它,如果您所建议的话。该机器人只是要request sub.example.com/robots.txt,因此您需要根据子域做一些事情以提供不同的响应。您无需使用mod_rewrite,但这是我见过多次的技术。如果robots.txt是动态生成的,则可以在服务器端代码(例如PHP)中更改响应。
— 怀特先生

使用的一种替代方法robots.txt是通过X-Robots-Tag: noindex在访问此类子域时发送HTTP响应标头来防止建立索引(而不是进行爬网)(也可以在.htaccess中完成)。尽管我认为防止爬网可能更可取。(?)
— 怀特先生

1

robots.txt 仅在根目录中存在时有效。

您需要robots.txt为每个子域网站分别上传一个文件,可以从中访问该网站http://subdomain.example.com/robots.txt。

将以下代码添加到 robots.txt

User-agent: *
Disallow: /

另一种方法是,您可以<META>在所有页面中插入一个机器人标签。

<META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">

3
但是OP已经声明:“通常我会进行修改/robots.txt和添加Disallow: /,但是由于共享的代码库,我无法在/robots.txt不影响所有(子)域的情况下进行修改。”
— 怀特先生

0

我将从html页面中删除meta标签,并根据您的子域动态地构建它。例如,我们使用子域dev。为发展。因此,在pageload事件中,我们有以下内容:

  ' Check if domain is DEV or PROD and set robots accordingly meta tag in head
  Dim metatag As HtmlMeta = New HtmlMeta
  metatag.Attributes.Add("name", "robots")
  If CurrentURL.Contains("dev.advertise-it") Then
    metatag.Attributes.Add("content", "NOINDEX, NOFOLLOW")
  Else
    metatag.Attributes.Add("content", "INDEX, FOLLOW")
  End If
  Page.Header.Controls.Add(metatag)

尽管这不能防止爬网,但这似乎是OP的要求。
— 怀特先生
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.