经营品牌: 强力巨彩 海佳彩亮 飞利浦 利亚德 创维 京东方 海康威视 仰邦 诺瓦 卡莱特 小鸟羽控
027-89992224
LED显示屏专业解决方案服务商
Professional solution service provider

shopxo不存在的url会提示应用未启用

[复制链接]
王铭 发表于 3 天前 | 显示全部楼层 |阅读模式
修改public/index.php,全部替换为以下代码。

  1. <?php
  2. // [ 前端入口文件 ]
  3. namespace think;

  4. require __DIR__.'/core.php';
  5. require __DIR__ . '/../vendor/autoload.php';

  6. $http = (new App())->http;
  7. $response = $http->name('index')->run();

  8. // ★★★ 全面404修正 ★★★
  9. $content = $response->getContent();
  10. $code = $response->getCode();
  11. $need_404 = false;

  12. // --- 检测1:ThinkPHP框架级错误提示 ---
  13. // 这些是ThinkPHP在路由/控制器层面直接输出的错误文本,状态码都是200
  14. $framework_errors = [
  15.     '应用未启用',       // 多应用模式下,URL中的应用目录不存在
  16.     '控制器不存在',     // URL中的控制器类不存在(如/sitemap/xxx)
  17.     '方法不存在',       // 控制器中的方法不存在
  18.     '操作不存在',       // 同上,某些ThinkPHP版本用此提示
  19.     '非法访问',         // ShopXO Common::__call()输出的提示
  20. ];
  21. foreach ($framework_errors as $err) {
  22.     if (strpos($content, $err) !== false) {
  23.         $need_404 = true;
  24.         break;
  25.     }
  26. }

  27. // --- 检测2:ShopXO数据不存在页面(tips_error模板)---
  28. // 商品/文章/分类等数据不存在时,ShopXO渲染tips_error页面但状态码是200
  29. if (!$need_404 && $code == 200) {
  30.     $error_marks = ['不存在或已删除', '不存在'];
  31.     $exclude_marks = ['购物车还是空的', 'empty-cart'];

  32.     $has_error = false;
  33.     foreach ($error_marks as $m) {
  34.         if (strpos($content, $m) !== false) {
  35.             $has_error = true;
  36.             break;
  37.         }
  38.     }

  39.     $is_exclude = false;
  40.     foreach ($exclude_marks as $m) {
  41.         if (strpos($content, $m) !== false) {
  42.             $is_exclude = true;
  43.             break;
  44.         }
  45.     }

  46.     if ($has_error && !$is_exclude) {
  47.         $need_404 = true;
  48.     }
  49. }

  50. // --- 输出真正的404 ---
  51. if ($need_404) {
  52.     http_response_code(404);
  53.     header('Content-Type: text/html; charset=utf-8');
  54.     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>');
  55. }

  56. $response->send();
  57. $http->end($response);
  58. ?>
复制代码


 楼主| 王铭 发表于 3 天前 | 显示全部楼层
更新的代码,可以用这个。

  1. <?php
  2. // [ 前端入口文件 ]
  3. namespace think;

  4. require __DIR__.'/core.php';
  5. require __DIR__ . '/../vendor/autoload.php';

  6. $http = (new App())->http;
  7. $response = $http->name('index')->run();

  8. // ★★★ 软404修正(HTML结构检测法)★★★
  9. $content = $response->getContent();
  10. $code = $response->getCode();
  11. $need_404 = false;

  12. // 第1层:非HTML的框架错误(纯文本输出,无<html>标签)
  13. if ($code == 200 && stripos($content, '<html') === false && stripos($content, '<!DOCTYPE') === false) {
  14.     $framework_errors = ['应用未启用', '控制器不存在', '方法不存在', '操作不存在', '非法访问'];
  15.     foreach ($framework_errors as $err) {
  16.         if (strpos($content, $err) !== false) {
  17.             $need_404 = true;
  18.             break;
  19.         }
  20.     }
  21. }

  22. // 第2层:tips-error CSS类(ShopXO数据不存在页面)
  23. if ($code == 200 && !$need_404 && stripos($content, 'tips-error') !== false) {
  24.     $need_404 = true;
  25. }

  26. // 输出真正的404
  27. if ($need_404) {
  28.     http_response_code(404);
  29.     header('Content-Type: text/html; charset=utf-8');
  30.     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>');
  31. }

  32. $response->send();
  33. $http->end($response);
  34. ?>
复制代码


您需要登录后才可以回帖 登录 | 注册

本版积分规则

返回顶部