直接跳首页等于放弃seo,因为ecshop默认用302重定向到首页,导致搜索引擎持续抓取旧url并重复索引首页,真实页面不被收录,且掩盖死链;必须修改article.php、article_cat.php、brand.php、category.php、comment.php、goods.php、topic.php共7个文件,将跳首页语句替换为404响应头加404模板渲染,并同步配置web服务器正确返回404状态码。

为什么直接跳首页等于放弃SEO
ecshop默认对不存在的商品、分类、文章等请求,执行 ecs_header("Location: ./\n"); exit;。这返回的是HTTP 302状态码,搜索引擎会认为“该页面临时搬家”,持续抓取旧URL并索引首页内容,久而久之导致大量重复首页、真实商品页不被收录。更糟的是,它掩盖了真实404场景,让运营和SEO人员无法通过日志识别死链。
修改哪些PHP文件才能覆盖全部404入口
不能只改 goods.php 或 category.php —— ecshop的路由分散在多个入口脚本中,漏掉任何一个都会让对应类型URL继续302跳首页。必须统一处理以下7个文件:
article.phparticle_cat.phpbrand.phpcategory.phpcomment.phpgoods.phptopic.php
找到其中所有形如 ecs_header("Location: ./\n"); exit; 或 header("Location: ./"); exit; 的语句,全部替换为:
ecs_header("HTTP/1.0 404 Not Found");
$smarty->display('404.html');
注意:$smarty 实例在此时已初始化,可直接调用;但确保你的 404.html 文件已放在模板目录(如 themes/default/404.html)且能被正确加载。
服务器层404配置必须同步,否则状态码仍为200
即使PHP代码返回了404头,如果Web服务器(Apache/Nginx/IIS)未正确接管,浏览器或爬虫看到的仍是200状态。常见陷阱:
- Apache下仅写
ErrorDocument 404 /404.html,但没加Header set Status "404 Not Found",静态HTML返回200 - IIS中设置404时选了“URL”而非“文件”,导致重定向后返回200
- Nginx里用
error_page 404 /404.html,但没配fastcgi_intercept_errors on;,PHP错误仍透出500
推荐做法:保留PHP层主动发404头 + 模板渲染,同时在Web服务器配置中禁用自动跳转逻辑,避免双重响应干扰。
PHP版本升级后容易崩的两个关键点
ecshop老代码在PHP 7.2+下运行时,cls_template.php 中的正则回调和静态方法调用会直接报错,导致404逻辑根本走不到。必须提前修复:
-
preg_replace("/{([^\}\{\n]*)}/e"→ 改为preg_replace_callback("/{([^\}\{\n]*)}/", function($m) { return $this->select($m[1]); }, $source) -
cls_image::gd_version()→ 改为(new cls_image())->gd_version()或补static关键字
否则,你改完了所有入口文件,结果一访问不存在商品就直接500白屏——连404页面都出不来。
真正起作用的404不是单点替换,而是PHP逻辑、模板路径、Web服务器响应头三者咬合。最容易被忽略的是:没有验证最终HTTP状态码是否真的为404。用curl -I 或浏览器开发者工具Network标签检查,别只看页面长什么样。











