同一篇内容有多个可访问地址时,规范地址该标在哪里
同一篇内容有多个可访问地址时,规范地址应该标在页面里还是响应头里?两处都行,效果是等价的。协议层把这件事写得很清楚:规范关系值用来标识资源的规范版本(即这个地址串及其内容),既可以通过响应头里的链接关系表达,也可以在文档内置的链接元素里写,连相对形式的简写都在示例里给出。也就是说,位置不是问题,选哪个地址、什么时候用跳转才是问题。
多个地址并存是从哪来的
站内一篇内容能被访问到的地址,通常来自四个来源:带筛选或分页参数的列表衍生地址、伪静态改写前后的两种形态、尾部斜杠与大小写差异、以及从短链或活动页跳转过来时保留的原始地址。
这些来源里,多数不是有意做出来的,而是配置叠加的结果。开了伪静态规则,带参数的旧形态仍然能打开;做了栏目改名,旧地址没配跳转,也照样有内容返回;同一篇内容被放进了两个栏目,就得到两条路径。
并存本身不算错,问题是同一份内容用多个地址都能取到,外部引用与统计会被拆开。声明规范地址要解决的就是这件事。
协议里这条链接关系的定义
这条关系值的定义落在两句话上:一是「标识资源的规范版本」,二是「地址串及其内容一起构成被标识的对象」。
由此能读出三条实际边界。
第一条,它是声明而不是命令。协议规定的是怎么表达意图,读取方是否按此合并是另一件事,所以不能把它当成处理重复内容的替代手段。
第二条,它能出现在两个位置。响应头与文档内置标记都合法,选哪个取决于改造成本:模板能改就用标记,模板不便改、要在网关或应用统一处理时用响应头。静态资源类地址通常只有响应头这条路。
第三条,声明目标要指向自身一致的内容。规范地址指向的内容与来源内容不一致时,这条声明不但解决不了重复,还会引入新的歧义。
站内写的时候还要注意绝对与相对两种形式都可用,但多站点场景下用绝对形式更稳,能避免跨站相对解析出的目标不是预期那个站点。
能跳转和只能标记的两种情况
分工线在这里:只要一个地址能确定不再被独立使用,就用跳转把它合并掉;两个地址都要保留可用,就用规范声明把关系写出来。
AnQiCMS 支持 301 跳转管理与重定向设置,改版、栏目改名、旧链接保留都属于前一种情况——旧地址不该再有独立价值,直接配跳转,让访问与引用都汇到新地址上。
后一种情况更常见于参数形态:同一篇内容的带参地址、分页尾段、追踪参数是有意保留的,用户点进去要看的是同一份内容。这时用 AnQiCMS 的伪静态规则管理把对外形态定成一套,规范声明指向同一套里被认可的那个形态,避免声明目标和实际入口不一致。
两种手段不要交叉用。已经配了跳转的地址,再在旧内容页上写规范声明没有意义;反过来,需要保留多个入口的地址配跳转,会直接把功能改掉。
站内配置顺序与自查
按这个顺序做,返工较少:
先列清单。把同一篇内容能取到的地址形态列出来——带参数、伪静态、斜杠差异、跨栏目重复,各写一条样例地址。清单不列出来,后面每一步都是猜。
再分档。能合并的走跳转,要保留的进声明集合。这一步只做一个判断:这个地址有没有独立使用价值。
然后定声明。伪静态规则里定下对外形态,把规范声明指向它;声明位置全站内保持一致,不要有些页面写在标记里、有些写在响应头里——两种都合法,但混用会让后续核对找不到统一入口。
最后核对。取一篇内容的所有地址逐个访问,看返回的状态码、最终落到的地址、声明指向的目标三者是否互相一致;再抽查站点地图里列出的地址是不是被认可的那个形态。
常见问题
页面里写规范声明后还需要跳转吗? 看用途。声明处理的是「同一份内容的多个入口谁代表自己」,跳转处理的是「旧地址不再对外提供服务」。改版和换路径属于后者,只写声明不够。
响应头和页面标记同时写会不会冲突? 定义上两处都可用,但内容要一致。两边指向不同目标时,读取方拿到的就是两个矛盾声明,反而更难解释。
分页列表要声明到哪一页? 分页各页内容不同,不属于同一份内容,声明应指向自身而不是第一页。只有当某一页只是同一份内容的另一种呈现时,才把声明指向那一套地址的规范形态。
多语言站点要不要互相声明? 不要。不同语言的正文内容不同,不构成重复;跨语言互指反而会把两种语言的内容当成一份处理,各语言内部自己保持一致更合理。