修改public/index.php,全部替换为以下代码。
<?php
// [ 前端入口文件 ]
namespace think;
require __DIR__.'/core.php';
require __DIR__ . '/../vendor/autoload.php';
$http = (new App())->http;
$response = $http->name('index')->run();
// ★★★ 全面404修正 ★★★
$content = $response->getContent();
$code = $response->getCode();
$need_404 = false;
// --- 检测1:ThinkPHP框架级错误提示 ---
// 这些是ThinkPHP在路由/控制器层面直接输出的错误文本,状态码都是200
$framework_errors = [
'应用未启用', // 多应用模式下,URL中的应用目录不存在
'控制器不存在', // URL中的控制器类不存在(如/sitemap/xxx)
'方法不存在', // 控制器中的方法不存在
'操作不存在', // 同上,某些ThinkPHP版本用此提示
'非法访问', // ShopXO Common::__call()输出的提示
];
foreach ($framework_errors as $err) {
if (strpos($content, $err) !== false) {
$need_404 = true;
break;
}
}
// --- 检测2:ShopXO数据不存在页面(tips_error模板)---
// 商品/文章/分类等数据不存在时,ShopXO渲染tips_error页面但状态码是200
if (!$need_404 && $code == 200) {
$error_marks = ['不存在或已删除', '不存在'];
$exclude_marks = ['购物车还是空的', 'empty-cart'];
$has_error = false;
foreach ($error_marks as $m) {
if (strpos($content, $m) !== false) {
$has_error = true;
break;
}
}
$is_exclude = false;
foreach ($exclude_marks as $m) {
if (strpos($content, $m) !== false) {
$is_exclude = true;
break;
}
}
if ($has_error && !$is_exclude) {
$need_404 = true;
}
}
// --- 输出真正的404 ---
if ($need_404) {
http_response_code(404);
header('Content-Type: text/html; charset=utf-8');
die('<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><title>404 - 页面不存在</title><meta name="robots" content="noindex,nofollow"><style>body{text-align:center;padding:80px 20px;font-family:sans-serif}h1{font-size:48px;color:#333}p{font-size:18px;color:#666}a{color:#1a73e8;font-size:16px}</style></head><body><h1>404</h1><p>您访问的页面不存在或已被删除。</p><a href="/">返回首页</a></body></html>');
}
$response->send();
$http->end($response);
?>







更新的代码,可以用这个。