一个链接点进去,落到别的栏目,甚至跑到别人站上,这事看着玄乎,链路上能改地址的地方就那么几个。网站跳转乱跑问题多半在这一层——Web服务器或者CDN上那条写歪了的重定向规则。别急着翻代码,先把“最后谁说了算”想清楚:浏览器缓存、CDN、反向代理、Web服务器、程序本身,五道关,后一道能盖掉前一道。你改的是第一道,当然改了跟没改一样。

网站跳转乱跑问题多半在这一层:先弄清谁在改地址
请求从浏览器发出去,到程序吐出页面,中间至少四层能插一脚。浏览器有缓存和HSTS,CDN有回源和强制跳转,Web服务器有rewrite和return,程序内部还有一堆拼出来的URL。谁的规则最后执行,谁就把地址定死。不少人改完nginx发现没用,八成是CDN那边还缓存着上一次的301,或者浏览器把301记住了。技术上不复杂,难的是知道该看哪一层。
浏览器缓存能骗你半天
301是永久的,浏览器会把它记在本地,Chrome这类浏览器记得还挺久,有些情况你不手动清就一直在。于是出现一种很典型的现象:你在服务器上把规则删了,自己电脑上还是往老地址跑,换个浏览器或者开无痕就好了。调试阶段我建议先用302,确认逻辑通了再换301,别一上来就permanent。
藏得更深的是HSTS。服务器回过一次 Strict-Transport-Security 头,浏览器接下来一段时间就强制走https,你在地址栏敲http它自己给你改成https,看着像乱跳,是安全策略在起作用。这个清不掉,只能等max-age过期,或者去浏览器的站点设置里手动删掉该站点的数据。
CDN和反向代理这一层最容易被忘
CDN出事,症状往往更吓人:ERR_TOO_MANY_REDIRECTS,页面直接打不开。原因就那几种——CDN上开了强制HTTPS,回源却走http,源站又配了一条http跳https,两边互相推,循环就出来了。还有一种是CDN把带301的响应当普通内容缓存了,你源站改完,边缘节点还在发旧的。处理顺序:先关掉CDN的强制跳转,回源协议和源站保持一致,改完刷缓存。各家服务商开关名字不一样,具体以控制台页面说明为准,别照搬别人的截图。
rewrite规则和伪静态,顺序就是命
nginx里 return 301 和 rewrite … permanent 都能跳,return更直接、不经过正则。真正容易出事的是location匹配顺序和server_name。一台机器挂好几个站,请求的Host没匹配上任何一个server_name,就落到default_server,也就是第一个或者标了default_server的那个,于是访问A站跳到了B站。这种“乱跑”我见过不止一次,日志里看Host就明白了。
Apache这边看.htaccess,RewriteRule后面的[L]是停止处理后续规则,漏了它,一条接一条往下串,最后跳到哪自己也说不清。伪静态规则尤其别乱抄,程序版本不一样,规则差一个参数就全站跑偏。拿不准就把整段注释掉,一条一条放开试,慢是慢点,但省心。
程序里那两个地址最坑人
搬到新域名之后整站往旧域名跳,这个几乎每个用WordPress的都撞过。库里 wp_options 表的 siteurl 和 home 两个值还写着老地址,程序按这个值拼所有链接,前台怎么点都是老域名。wp-config.php 里定义 WP_HOME 和 WP_SITEURL 能盖过去,但治标,迁移完还是要把库里的值改干净,顺手搜一遍文章正文里的老域名,不然内链也跟着跑。
再就是移动端跳转。有些主题或插件判断UA是手机就跳到 m 子站,判断逻辑写歪了,桌面浏览器也被当成手机,来回跳。还有直接写在页面里的JS,location.href 一赋值就走,这种在源码里搜 location 或者 meta refresh,能揪出来。
按这个顺序剥,比乱改快
排查顺序大概是这样:一,无痕窗口打开,或者换个没访问过这站的浏览器,先把本地缓存排除掉;二,命令行 curl -I 域名,看返回头里的 Location 和状态码,curl不吃浏览器缓存,看到的是服务端真实反应;三,想数跳了几次,用 curl -IL –max-redirs 5,把每一跳的地址打出来,一眼就能看出从哪一跳开始跑偏;四,临时改本机 hosts,把域名指到源站IP,绕开CDN再看一遍,两边表现不一样,问题就在CDN那层;五,都正常了再回头查nginx配置和程序设置,一层层往里剥;六,改完别忘了刷CDN缓存,不然你看到的是旧结果,白高兴一场。
跳转这事儿,改对一行规则只要一分钟,找错那一层能耗掉一整天。下次再遇到链接乱跑,先别动代码,把curl拉出来的那几行响应头看清楚:Location指向哪、跳了几次、中间有没有一关卡在CDN上。地址是你自己指出去的,它不会无缘无故跑偏。
【版权声明】:本站内容若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!