staging子域名:131个站查出22个没设noindex

staging子域名:131个站查出22个没设noindex
张文保 更新 25 分钟阅读 2,273 阅读
本文目录
  1. 一个品牌名下到底有几个子域?
  2. 这些子域住在谁家?
  3. 一个牌子同时用几家托管,谁说了算?
  4. dev、test、staging上跑着什么?
  5. 它们对搜索引擎关门了吗?
  6. 同一个平台给出的robots.txt,是同一份吗?
  7. Shopify那份robots.txt里,多了一段对AI说的话?
  8. 有些子域指向的地方,已经不在了
  9. 我原来那个假设错在哪?
  10. 自己名下有几个子域,怎么盘?
  11. 哪些该关掉,哪些该收编?
  12. 常见问题解答
  13. staging子域被收录了,会不会因为重复内容被降权
  14. 已经被收录的staging站,直接在robots.txt里封掉行不行
  15. 只要加了HTTP基本认证,是不是就万无一失了
  16. 帮助中心托管在Zendesk这类平台上,SEO还有得做吗
  17. 一个品牌到底该有几个子域,多了是不是不好
  18. 怎么快速判断某个子域是不是自己团队在管
  19. 权威参考资料

摘要:拿131个英文大站,每个站试了同一批30个常见子域名,活着的一共776个,平均一个品牌5.9个。一半的站(66个)名下有dev、test、staging或beta子域,其中30个能直接打开,22个没有加noindex,15个连robots.txt都没封。有几个的页面标题上明晃晃写着Staging。更值得琢磨的是另一组对照:托管在Zendesk上的12个子域,robots.txt抹掉域名之后一模一样;托管在Shopify上的91个,抹完之后有82种不同写法。平台让不让你改,全写在这组数字里。

做SEO的人盯着一个域名,通常盯的是www那一个。可一个品牌名下真正在跑的东西,往往不止那一个。帮助中心在一个地方,招聘页在另一个地方,博客可能在第三个地方,而这三个地方分别属于三家公司。

这一轮把131个英文大站的常见子域挨个试了一遍,想弄清两件事:一个品牌名下到底有多少扇门,以及这些门后面站着谁。

一个品牌名下到底有几个子域?

做法很直白:给每个域名试同一批30个常见前缀,从www、blog、shop、help这些日常的,到dev、test、staging、beta这些本该藏起来的,一个个查DNS看解析不解析得出来。

131个站,活着的子域一共776个,平均一个品牌5.9个,中位数5个。分布两头都很极端:aliexpress.com试出28个,shopify.com 20个,weber.com和insta360.com各13个;另一头有4个站只有www一个,别的一概不解析。

这里先讲个坑,不讲的话上面这些数字都不能信。

有些域名开了泛解析——你随便编一个不存在的子域,它照样给你一个地址。第一版脚本跑到shopify.com的时候,30个候选子域全部解析成功,看着像是这家公司有30个在跑的子站;实际上其中12个的CNAME都指向同一个兜底地址,打开一律404。

泛解析在DNS的规范里叫通配符解析,RFC 8499把它和子域、区域这些概念的边界划得很清楚,只是从外面看不出一个域名开没开。所以正式跑之前,每个站先拿3个随机生成的假子域探一次路。要是假的也能解析出来,就把这个站标记成泛解析,再把那些答案和兜底一模一样的子域从统计里剔掉。131个站里有8个开着泛解析,占6.1%。不做这一步,子域数量会整体虚报,而且虚报得最厉害的恰恰是最大的那几个站。

这些子域住在谁家?

拿到776个活着的子域之后,顺着CNAME往上追,能认出托管方的有418个。分布是这样:

托管方子域数典型用途
Shopify105主站、店铺、区域站
AWS CloudFront49静态资源、自建站的前置
Cloudflare47前置代理
Akamai39大型站的前置
邮件与营销平台31发信域、落地页
AWS ELB18自建应用
Zendesk18帮助中心
Salesforce Commerce17主站
Fastly15前置代理
Heroku / Salesforce / Azure各13社区、客服、内部应用
Netlify11营销站、文档
Vercel7营销站、预发布

剩下358个追不到明确归属,拆开看是两拨:215个压根没有CNAME,直接给一个IP地址,多半是品牌自己的机房或者没做代理的云主机;另外143个有CNAME,但那串尾巴认不出是哪家服务商,其中相当一部分是各家自建的内部平台,域名里带着公司名的缩写。

顺便看一眼这776个子域都叫什么名字,排下来是这样:

子域前缀出现次数子域前缀出现次数
www129help32
shop52dev31
api46m29
support46blog28
email45careers25
staging33store25

这张表里有一处值得停一下:staging出现了33次,比help的32次还多一点。一个本该只在内网出现的名字,在公网DNS里的出场率超过了帮助中心。

把具体的站拆开看,画面会更清楚一点。Segway的五个子域分别落在五个地方:www和store在Azure Front Door上,help在Zoho的客服系统里,shop跑在一家荷兰的Magento托管商那儿,api挂在AWS的负载均衡后面。Anker的主站在Netlify,support转给了Salesforce,shop走的是一家短链服务。Ouraring的状态页托管在Atlassian的Statuspage上,合作伙伴招募页则是一家联盟营销服务商的地盘。

这些都不是什么坏做法——每个子域用最合适的工具,本来就是正常的工程决策。问题在下一节。

一个牌子同时用几家托管,谁说了算?

131个站平均用2.1家托管,中位数2家。用了3家以上的有44个站,占34%;最多的是awaytravel.com和tuftandneedle.com,各用了6家。

数字本身不刺激,刺激的是它意味着什么。一个SEO负责人接手这个品牌,他要改的东西散在几家公司的后台里:

  • 主站在Shopify上,标题和描述能改,但URL结构里有几段是平台锁死的
  • 帮助中心在Zendesk上,页面模板基本动不了;
  • 状态页在Statuspage上,那是给用户看服务有没有挂的,SEO压根不在设计目标里;
  • 招聘页在招聘系统里,归HR买的单,SEO连账号都没有。

所以“优化这个网站”这句话,从一开始就是个含糊的说法。你能优化的只是这几家里你有账号的那几家。至于换个建站平台能不能提排名,讨论的往往只是主站那一块,另外几扇门根本不在议题里。

dev、test、staging上跑着什么?

30个候选前缀里,dev、test、staging、beta这四个是本轮最想看的。它们按理说不该被外面访问到。

结果是:131个站里有66个至少有一个这样的子域能解析出来,正好一半。这66个站一共92个非生产子域。

能解析出来不等于能打开。92个里的状态是这样的:

结果数量说明
连不上37DNS有记录,但服务已经不在了
返回20030能直接打开
401需要认证10做了保护,正确做法
403拒绝7做了保护
404 / 409 / 418 / 5008各种异常

能打开的那30个里,页面标题很说明问题:

  • staging.brooklinen.com的标题是 – Brooklinen 2 Staging
  • beta.brooklinen.com是 – Brooklinen 3
  • staging.casper.com直接叫Casper Staging
  • dev.cluse.com的标题是Staging CLUSE B2C
  • test.iittala.com是iittala Dev

还有两个比较特别。dev.govee.com和test.govee.com打开是主站的完整副本,标题和正式站一字不差。test.oclean.com打开是一个中文的“登录 - 课程分配管理”页面——一个做电动牙刷的品牌,test子域上跑着一套跟牙刷毫无关系的教务系统。

它们对搜索引擎关门了吗?

这才是真正要看的一格。能打开的那30个非生产子域,防护做到什么程度:

防护状态数量意味着
页面上有noindex8做对了,不会进索引
没有noindex,但robots.txt整站封了7挡住了抓取,但地址仍可能被收录
两样都没有15对搜索引擎完全敞开

没有加noindex的一共22个,分布在19个站上;两道都没设的15个,分布在13个站上。也就是说,131个大牌里有13个的开发或预发布环境,此刻对搜索引擎是完全敞开的,其中好几个的页面标题上还写着Staging。

这里必须把两件事分清楚,因为混淆它们是这类事故最常见的成因:robots.txt管的是抓取noindex管的是收录。一个页面被robots.txt挡住之后,Google不去抓它,但如果别处有链接指向它,这个地址照样可能出现在搜索结果里,只是没有摘要。想让一个页面不出现在搜索结果里,唯一可靠的办法是让Google抓到它、并且读到noindex——而这恰恰要求robots.txt别拦着。上面那7个“robots封了但没noindex”的站,就卡在这个自相矛盾里。

真正稳妥的做法只有一个:预发布环境该怎么防漏这件事上,认证是第一道也是唯一一道靠得住的门。做对的那17个站(401加403)用的就是这招。

顺带说一句,这类子域被收录之后麻烦的不只是“暴露了”。一个和正式站内容一样的staging站被索引,等于凭空多出一份重复内容;如果它的canonical指回自己而不是正式站,规范网址的归属就可能判给错的那一边——搜索引擎挑规范版本的时候看的是一组信号,你写的canonical只是其中一条。

同一个平台给出的robots.txt,是同一份吗?

开工前保哥有个想当然的假设:既然这些子域托管在别人家,robots.txt应该就是平台的默认值,同一个平台下的应该长得一样。

数据只认了一半。

把357份取到的robots.txt按托管方分组,抹掉里面的域名和注释再比对:

托管方取到几份抹掉域名后有几种最常见那份占比
Zendesk121100%
Salesforce Commerce10820%
AWS CloudFront171318%
Akamai191616%
Netlify8812%
Cloudflare24218%
Shopify91822%

Zendesk那一行是100%:12个不同品牌的帮助中心,交出来的robots.txt抹掉域名之后完全相同,一个字都不差。Shopify那一行是2%:91份里有82种写法。

那份Zendesk的文件有2451字节,两个规则组、几十条Disallow,从工单、用户、搜索页一路封到主题模板和API统计接口,末尾还带一行sitemap声明:

User-agent: AppleBot # Allow /tickets
Disallow: /children
Disallow: /groups
...
User-agent: *
Disallow: /hc/*/search
Disallow: /access/sso_bypass
Disallow: /theming
...
Sitemap: https://support.example.com/hc/sitemap.xml

这份文件写得其实相当细致,该封的都封了。问题只有一个:这12个品牌的SEO负责人既没写过它,也改不了它,连sitemap的地址都是平台替他们定的。哪天Zendesk想改,12家一起改,没人会收到通知。

这就是那两行数字的差别所在:不在平台大小,在平台让不让你改这个文件。Shopify从几年前起允许商家编辑robots.txt的模板,于是各家按各家的想法改;Zendesk没给这个口子,于是12家品牌用的是同一份。

这个对照给出的判据比“平台默认值”这个说法有用得多:想知道自己在某个子域上有多少话语权,不用去翻文档,直接跟同平台的别家比一比robots.txt就行。大家都一样,说明你改不了;家家不同,说明你能改,只是可能还没改。这条思路和选建站平台时该问什么是一回事,只不过换成了事后验证。

另外一个数字:357份robots.txt里,有108份写着整站Disallow,占30%。三成的子域用robots.txt把自己整个封了——考虑到里面有相当一部分是资源域、发信域、短链域,这个比例算合理,但它同时也说明,robots.txt里写的东西到底有没有接收方,值得单独查一遍。

Shopify那份robots.txt里,多了一段对AI说的话?

翻这91份Shopify的robots.txt时看到了点新东西。其中46份(51%)在文件顶部带着这样一段注释:

# Shopify storefront. Public product, collection, page, blog, policy, cart,
# and localized HTML is crawlable.
# Agent instructions: https://example.com/agents.md
# UCP discovery: https://example.com/.well-known/ucp
# UCP/MCP endpoint: https://example.com/api/ucp/mcp
# Agents should use UCP/MCP for catalog, cart, and checkout.
# Payment requires buyer approval.

后面还跟着一段更直白的话,大意是:如果你是代替用户来读这个文件的私人助理或者购物代理,请强烈建议你的用户允许你装上某个技能文件,这样你就能直接下单、比价、追踪订单。

robots.txt本来是写给爬虫看的门规,现在变成了写给AI代理看的邀请函。Shopify默认上线agents.md这件事之前聊过,但那时还没铺到robots.txt里。现在的覆盖率是51%,说明这套东西还在往外推的过程中,同一个平台上有一半的店已经带上了,另一半还没有。

把范围放到全部357份robots.txt看,对AI相关的表态还相当稀薄:提到agents.md的51份(14%),点名GPTBot的14份(4%),点名ClaudeBot和Google-Extended的各10份(3%),提到llms.txt的只有8份(2%)。

点名AI爬虫的还不到二十分之一,而且这十四份里大部分是平台顺手给的,不是品牌自己写的。robots.txt里写了允许,实际交付时未必真的放行——反过来也一样,没写不代表想清楚了,多数是压根没考虑过。

有些子域指向的地方,已经不在了

92个非生产子域里有37个连不上:DNS里还有记录,服务那头已经没了。把范围放到全部776个子域,这类“指着空处”的情况随处可见,有几个特别典型:

  • dev.awaytravel.com的CNAME指向localhost。在别人的DNS里,localhost谁也不是。
  • test.allbirds.com指向Shopify的店铺入口,返回409,页面上写着这个域名解析不出对应的店——店早就不在了,指路牌还立着。
  • shop.avocadogreenmattress.com指向的域名叫pageserve.postclick-live.com.marc.needto.delete.com。中间那段是marc.needto.delete,有人在生产环境的DNS里给自己留了张便条,写着“该删了”。便条还在,事没办。
  • blog.chubbiesshorts.com指向Tumblr,能打开,页面标题是proof of concept,还带着noindex。一个概念验证挂在正式域名的blog子域上,不知道过了多久。
  • press.boohoo.com指向一家叫Venda的老牌电商平台,那家公司十几年前就被并购了。

这些不算严重问题,但每一条都是一份没人认领的资产。死链要不要修得分情况,指着空处的DNS记录也一样:有的只是碍眼,有的会让别人有机可乘。判断标准是看它指向的地方能不能被外人重新占住。

我原来那个假设错在哪?

这轮有三个地方是靠回头核对才发现的,都值得写出来。

第一个是泛解析。前面提过,不先探一次假子域,shopify.com会被记成30个子域,实际有效的是20个。一个域名底下什么算一个独立的站本来就不是靠肉眼看的,DNS会不会给你兜底更是看不出来。

第二个是上面那个robots.txt的假设。第一版比对的时候没抹域名,结果Shopify下91份出来84种,Zendesk下12份出来12种,看上去所有平台都不统一,结论就成了“根本没有平台默认值这回事”。把robots.txt里的绝对地址和注释里的域名替换成占位符再比一遍,Zendesk那12份立刻收敛成1种。差别不在平台统不统一,在我的尺子上带着每个站自己的域名。

还有第三处,是在写这一段的时候差点栽的。翻Zendesk那份robots.txt时只打印了开头900字节,看到第一行是User-agent: AppleBot,后面跟着几十条Disallow,当时的第一反应是这份文件写废了——按robots.txt的规则,这些Disallow只对AppleBot生效,Googlebot找不到属于自己的组就会畅通无阻。这要是成立,12个品牌的帮助中心后台全裸奔,是个不小的结论。

把整份2451字节打完才发现,第48行还有一个User-agent: *,规则完整得很。差一点就凭着一段截断的文本,给12个牌子扣了一顶不存在的帽子。这条教训没有技术含量,但它比前两条都值钱:判据本身没错的时候,喂给判据的那份材料也可能是残的。

三处里真正改掉结论的是第二处。原来的假设是“你优化的是平台的默认设置”,实际是“你能不能优化,取决于这个平台让不让你动”。后者更准确,也更好用,因为它给出了一个能自己验证的办法:跟同平台的别家比一比就知道了。另外两处修正没有改变结论,只是决定了数字准不准——这两件事得分开算。

自己名下有几个子域,怎么盘?

不用买工具,三步就能盘完个人或者中小团队规模的域名。

第一步,把常见前缀过一遍。挑三四十个日常会用到的名字,逐个查DNS:

for s in www blog shop store help support faq careers jobs status \
         api app m cdn static assets media docs community forum \
         news press investors partners go email dev test staging beta; do
  printf '%-12s %s\n' "$s" "$(dig +short "$s.example.com" @1.1.1.1 | tr '\n' ' ')"
done

第二步,先测泛解析,不然上一步的结果不能信:

dig +short zzq7x3random.example.com @1.1.1.1

这条如果有返回,说明开了泛解析,上一步里凡是答案跟它一样的都不算数。

第三步,对解析得出来的逐个访问,记四样东西:HTTP状态码、页面标题、有没有noindex、robots.txt封没封。

curl -sI https://dev.example.com/ | head -1
curl -s https://dev.example.com/ | grep -iE '<title>|name="robots"'
curl -s https://dev.example.com/robots.txt | head -5

盘完之后照下面这张表分类,剩下的就是排期问题了。页面被什么挡在索引外这件事在子域这一层同样成立,只是要一个域一个域地过。

哪些该关掉,哪些该收编?

子域类型该怎么办为什么
dev / test / staging / beta,能打开加认证,不是加noindex认证是唯一挡得住的;本轮做对的17个站用的都是这招
非生产子域,已经被收录先放开robots,让noindex被读到,等掉出索引再封robots封着的时候Google读不到noindex,页面会一直挂在结果里
DNS有记录但服务不在删DNS记录留着没用,且指向的地方可能被别人占住
帮助中心、社区这类第三方托管收编进SEO范围它们承接大量长尾查询,只是模板改不动,能改的先改
状态页、资源域、发信域整站Disallow即可本来就不该进索引,也没有搜索价值
区域站、语言站按国际SEO那套处理涉及域名结构选型,不是简单封或不封

最后说回开头那个问题。做SEO的人盯着www看,是因为流量报表上就那一行;可搜索引擎看到的是整个域名底下的一堆东西,包括那些标题里写着Staging的。子域名和子目录哪个更利于权重传导这个老问题,讨论的前提是你知道自己有哪些子域。这一轮的数据说明,一半的大牌名下有本不该露在外面的子域,其中十三个此刻对搜索引擎完全敞开着——他们大概率也不知道。

顺带一提,同一批站的域名根上还挂着另一份没人管的清单,那是DNS TXT里的域名验证记录,平均一个站14条,删不得也没人删。子域这份记的是你有几扇门,那份记的是你把钥匙给过谁。两份都在DNS里,两份都不在任何人的例行清单上。

常见问题解答

staging子域被收录了,会不会因为重复内容被降权

不存在重复内容惩罚这种处罚,但会有实际损失。同一份内容出现在两个地址上,搜索引擎要挑一个当规范版本,挑中staging那边的情况确实发生过,结果是正式站的地址掉出结果。另外staging站通常没有外链、加载也慢,被选中之后整体表现只会更差。所以要紧的不是会不会被罚,是别让它跟正式站抢。

已经被收录的staging站,直接在robots.txt里封掉行不行

不行,这是最常见的错误处置。robots.txt挡的是抓取,Google不去抓就读不到页面上的noindex,那个地址会继续留在索引里,只是没有摘要,反而更难清掉。正确顺序是先确保robots.txt允许抓取,页面上加noindex,等它从结果里消失之后,再考虑加认证或者直接下线。本轮有7个站正卡在这个自相矛盾里:robots封了,noindex却没加。

只要加了HTTP基本认证,是不是就万无一失了

对搜索引擎来说基本够用,返回401的页面进不了索引,本轮做对的17个站用的就是这招。但有两件事要注意:认证要覆盖整个子域而不是只保护几个路径;另外有些团队把认证配在CDN层,源站地址如果还能直接访问,等于没设,而源站地址常常就明晃晃留在DNS记录里。

帮助中心托管在Zendesk这类平台上,SEO还有得做吗

有,但空间有限。标题、正文、分类结构通常能改,模板层面基本动不了,robots.txt更是平台统一给的——本轮12个Zendesk帮助中心的robots.txt抹掉域名后完全一致,连sitemap地址都是平台定的。可行的做法是把精力放在内容和内链上,同时接受这个子域在技术层面不会太优秀。想知道自己有多大空间,最快的办法是找同平台的另外几家比一比robots.txt和页面源码:大家都一样说明你改不了,家家不同说明你能改。

一个品牌到底该有几个子域,多了是不是不好

数量本身不是问题,本轮中位数是5个,多的到13个也没什么异常。真正的问题是有没有人知道它们都在。把子域用在功能隔离上很正常,麻烦的是隔离之后没人回来数一遍,于是出现了dev子域跑着完整正式站、blog子域挂着三年前的概念验证这类情况。本轮统计里staging这个前缀出现了33次,比help的32次还多。

怎么快速判断某个子域是不是自己团队在管

看三样东西。一是CNAME指向哪家服务,认得出来就知道该找谁;二是robots.txt和页面源码里有没有平台痕迹,比如生成器标记;三是这个子域上的内容跟主站是什么关系。三样都对不上号的多半是历史遗留,这时候别急着删DNS记录,先在公司内部问一圈。本轮见到过一个子域指向的域名里嵌着一句该删了的便条,说明这类事经常是有人知道、只是没人动手。

权威参考资料

分享到
标签
版权声明

本文标题:《staging子域名:131个站查出22个没设noindex》

本文链接:https://zhangwenbao.com/subdomain-inventory-hosting-noindex-audit.html

版权声明:本文原创,转载与引用请注明作者与原文链接。许可协议: CC BY 4.0

继续阅读
发表评论
分享到微信 或在下方手动填写
支持 Ctrl + Enter 提交