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


10

我的代码库几种环境(活,分期,DEV)&子域(之间共享staging.exampledev.example等),并且只有两个应允许被抓取(即www.exampleexample)。通常,我会修改/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.comexample.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.