我有一个多语言和多域站点。它通过唯一的CMS安装(Drupal)运行,因此我只有一个根目录。因此,如果我有一个静态robots.txt,据我所知,在那里我只能显示单个域的文件。

我可以在.htaccess中放入一行吗?

Redirect 301 /robots.txt /robots.php


(或等效指令,如果允许的话,请指出哪个)

,以便将其重定向到动态php文件,在该文件中,我可以根据$_SERVER['HTTP_HOST']

对于sitemap.xml也是一个相同的问题,因此我可以提供一个动态的sitemap.php,它指示每个不同域的不同链接。

没有问题如上所述,使用.txt和.xml是所有域在服务器计算机中共享一个物理目录。

评论

另请参阅:通过.htaccess将Google搜寻器重定向到其他robots.txt

#1 楼

您可以使任何文件动态化。最好的方法不是通过重定向,而是通过重写规则。

RewriteRule ^robots\.txt$  /robots.php [L]


这样,您可以使用动态脚本为其提供动力,但是URL却没有更改。大多数抓取工具(包括Googlebot)都将遵循robots.txt的重定向,但是如果您引入重定向,则某些抓取工具会感到困惑。

请注意,即使您使用PHP为其提供了动力,robots.txt也应显示为对于每个域的每个搜寻器都是静态的。可以为不同的域甚至不同的用户代理提供不同的内容。但是,随机提供不同的内容或基于一天中的不同时间提供内容,确实会使搜索引擎抓取工具感到困惑,并弄乱了您的SEO。


Sitemaps可以随意命名。您可以重定向它们,或使用重写规则在同一URL上动态为其供电。您也可以将它们命名为


site-a-sitemap.xml
site-b-sitemap.xml
site-c-sitemap.xml

,然后在robots.txt中对其进行引用:

Sitemap: http://www.example.com/example-sitemap.xml


,或通过其网站站长工具或搜索控制台将其手动提交给搜索引擎。

评论


感谢您的回复。请更正可能是拼写错误,它是有效的w3d指令,因此代码应为RewriteRule ^ robots \ .txt $ robots.php [L],不带\符号。

– es撒
15-10-22在10:39

是的,带斜杠的版本适用于您的apache.conf文件。对于.htaccess,您需要将其保留。我已经编辑了答案,以包括适用于.htaccess的版本。

–斯蒂芬·奥斯特米勒(Stephen Ostermiller)
15-10-22在13:07



@Cesar如果此指令位于服务器配置中,则模式上的斜杠前缀(即^ / robots \ .txt $)将是必需的,但是,是的,它在每个目录的.htaccess文件中均不匹配。在这种情况下,替换中的斜杠前缀(即/robots.php)是可选的。

–怀特先生
15-10-22在13:07

#2 楼

是的,任何请求都可以“动态”的方式。

但是,您不会重定向(如示例代码中那样),您应该使用mod_rewrite在内部进行重写。 (与Drupal可能已经在做的一样。)例如,在您的根.htaccess文件中:

RewriteEngine On
RewriteRule ^robots\.txt$ robots.php [L]


RewriteEngine仅应发生一次(尽管它是否多次出现并不重要)。

您只需要确保它与.htaccess文件中的任何其他指令都没有冲突即可。因此,这可能应该在文件的开头附近,肯定在您的前端控制器之前。

#3 楼

使站点地图文件动态化很好-这是自动更新站点地图的好方法。

使robots.txt文件动态(对于同一主机!对于单独的主机执行此操作实际上只是每个主机的常规robots.txt文件。)可能会导致问题:它不会每次都爬网从站点抓取URL的时间,因此可能会缓存“错误”版本。例如,如果您在工作时间内对robots.txt文件块进行爬网,则可能会对其进行缓存,然后再进行一天的缓存-这意味着不会对任何内容进行爬网(或者,允许爬网时也不会对其进行缓存)。例如,对于大多数网站,Google大约每天一次抓取robots.txt文件。

评论


我认为静态或动态之间没有区别。我还将使用动态部分根据不同的主机提供不同的版本,但是由于主机都共享计算机服务器中的同一物理目录,因此可以使用robots1.txt,robots2.txt,robots3.txt(数字表示我们在哪个域中)。

– es撒
15年10月28日在7:26

我认为动态性并不意味着他们每次都希望提供不同的内容。他们只是想通过PHP为其提供动力,因此他们可以根据PHP代码中的主机名做出决定。我经常使robots.txt动态化,以便为不同的用户代理提供不同的规则。

–斯蒂芬·奥斯特米勒(Stephen Ostermiller)
2015年10月29日在18:21

是的,正如我提到的,对多个主机执行此操作本质上就像每个主机具有单独的robots.txt文件,这很好。但是,有时我们会看到网站尝试使用动态robots.txt文件按一天的时间来控制抓取,这会引起很多问题。

–约翰·穆勒(John Mueller)
2015年11月2日,9:48



好点子。我已经编辑了接受的答案,并给出了警告,以免robots.txt变得非常动态。

–斯蒂芬·奥斯特米勒(Stephen Ostermiller)
2015年11月6日15:38

#4 楼

无需创建sitemap.php,因为:
1。对于每种语言,您可以运行一个单独的sitemap.xml文件,然后在搜索引擎控制台中进行指定。
2。可以定期重写标准站点地图文件以包括最近的内容,并且它以动态的方式使它们成为文件-不需要.php。取决于内部更新机制和cron来重新创建具有标准扩展名.xml的相同文件。Sitemap.xml文件是静态的,只有更新才能使它们动态化-它们不能实时更新。可能会导致它们每分钟重写一次,但没有必要,因为:
1. Google不会在自上次提交后不到1小时内检查它
2.当站点地图文件很大,经常重写它们会提高服务器性能。

当数据量很大并且站点地图文件大于50mb时,系统将具有多个站点地图是必须的。这意味着sitemap2,3 ... .xml将加到主文件的列表中,但是在重新创建这些文件之前,这些文件中的内容也保持固定(例如,通过cron进行创建)。

另外要提到的是,一旦搜索引擎访问了文件,它就不会很快返回到该文件(除非它是手动完成的)。它确认了在任何情况下都无需创建sitemap.php的实时更新,因为普通的sitemap.xml本身可以是动态的,可以在一整天或一周内使用新内容进行更新。

我想不出使用sitemap.php的任何专业人士。这样做没有好处,因为还有其他更好/适当的方式来使用这些文件。

评论


首选动态的一些原因:Sitemap占用大量磁盘空间,而动态生成则不占用磁盘空间。站点地图需要保持最新,动态站点地图可能是一种简便的方法。

–斯蒂芬·奥斯特米勒(Stephen Ostermiller)
19年8月30日在18:53