修改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);
- ?>
复制代码
|