站内搜索明明能用,链接却是 404,这事我查了三天
之前在文章里提过一次,站内搜索 404,一直拖着。 上周修了。 修的过程不难,是伪静态规则里漏了一条。难的是我拖了这么久才动手。 拖着的理由 我一直觉得站内搜索用的人少。 这判断其实对。后台数据看,从搜索框进来的流量不到百分之一。 但有个数
站内搜索本来应该是能用的。
实际用不了。
事情是这样。搜索框点下去,跳到类似 search.html?q=收录 这样的地址。这个地址对任何浏览者来说都该能打开。
打开是 404。
但我试着把地址换成 search.php?q=收录,页面正常加载,结果也对。
所以功能没问题,坏的是入口那个地址。
这三天的价值不在于把它修好,在于把「能用」和「访问得到」这两件事彻底分开。
先说结论
我的站跑在 nginx 上,不是 Apache。
仓库里没有 .htaccess 文件,主题目录里也没有。
这就意味着改主题模板里的任何一行,都不会影响 search.html 是 404 这件事。nginx 在请求到达 PHP 之前,就把它判死了。
主题那层动不了它,只能动服务器配置。
这个我改不了。没有服务器权限。
为什么之前一直没发现
两个原因,都很常见。
一是搜索进来的人少,后台看从搜索框点进来的流量不到百分之一。数据上它不重要,所以一直没排进待办。
二是站内自测只测了 search.php。功能是通的,就以为整件事是通的。
这个误区值得说一下。功能通不代表入口通。你的首页、分类页、文章页、搜索页,每一个页面的入口地址都应该单独查一遍。
查的方式很简单,打开页面,把地址栏里那串东西复制下来,自己再访问一次。
很多问题就这么现形。
404 真正影响的是什么
不严重。一个站几十上百条 404,不会直接被降权。
它占的是抓取预算。
爬虫每天来你站上的次数有限。花在死链上的次数,本来可以用来爬新文章。站越小,这个比例越明显。
还有一层更隐蔽。用户搜了东西,点进去是 404。他不会觉得你规则配错了,他就觉得这站坏了。
第一层是软成本,第二层是硬伤害。
正常应该怎么配
给要动手的人一个参考。
nginx 下,搜索页需要一条单独的 rewrite,把 search.html 转到 search.php,query string 要原样带过去。少了这一点,参数就丢了。
带参数的搜索页还要输出 nofollow。不然爬虫会顺着 ?q= 后面各种组合无限爬下去,那是另一个洞,比 404 还费预算。
顺便把 404 页本身也改一下。默认的空白页除了「页面不存在」什么都没有。放个搜索框,放几个热门分类,用户还能自己找回来。
我现在只能做到这一步
服务器那层等权限,加了规则我再验一遍。
404 页面那部分我做完了,是主题里能改的。
剩下的,说实话就是排队。排到我拿得到配置权限的那天。
不过文章还是写出来了。因为查清楚一件事和解决一件事,是两个阶段。前一个阶段我已经走完了,后一个卡在别人手里。
你站上有没有类似的洞
几个地方特别容易漏。
标签页。标签一多,每个标签一个页面,组合起来数量爆炸。规则不对,全是死链。
分页。翻到最后一页之后往往没处理,超出页码返回 200 而不是 404,或者直接报错。
日期归档。有些主题生成按年月归档的页面,规则漏一条就全 404。
去抓取日志里看 404 的 URL 长什么样,一眼能看出来漏在哪。
十分钟的事。
别像我一样拖半年。