增加Octane后beikeshop错误

1.500错误

500

Error Message: Undefined array key "REQUEST_URI"

500错误的原因是中间件直接访问了 $_SERVER'REQUEST_URI' ,但在Octane环境中这个全局变量可能没有被正确设置。需要修改中间件,使用Laravel Request对象来获取请求URI。# 500错误分析:Undefined array key "REQUEST_URI"

解决方案

修改 SetLocaleFromSession.php 中间件,使用Laravel Request对象的方法来获取请求URI,而不是直接访问 $_SERVER 全局变量。

具体修改步骤

  1. 修改文件 : d:\beikeshop\www\app\Http\Middleware\SetLocaleFromSession.php

  2. 修改第53行 :

  • 原代码: uri = _SERVER'REQUEST_URI';

  • 修改为: uri = request->getRequestUri();

完整修改后的 getLocaleFromUrl 方法 :修改后完整代码

复制代码
<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;

class SetLocaleFromSession
{
    /**
     * Handle an incoming request.
     *
     * @param Request $request
     * @param Closure $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next): mixed
    {
        // 优先从请求头中获取 'locale'
        $localeFromHeader = $request->header('locale');
        if ($localeFromHeader && in_array($localeFromHeader, languages()->toArray())) {
            $locale = $localeFromHeader;
        } else {
            // 如果请求头没有语言,尝试从 URL 中提取
            $localeFromUrl = $this->getLocaleFromUrl($request);
            if ($localeFromUrl) {
                $locale = $localeFromUrl;
            } else {
                // 如果都没有从请求头或 URL 中获取到语言,使用会话中的语言
                $locale = session('locale');
                if (!$locale || !in_array($locale, languages()->toArray())) {
                    // 如果会话中没有有效语言,使用系统默认语言
                    $locale = system_setting('base.locale');
                }
            }
        }

        // 设置语言
        App::setLocale($locale);
        session(['locale' => $locale]);

        return $next($request);
    }

    /**
     * 从原始请求 URL 中解析出语言代码
     *
     * @return string|null
     */
    /*
    private function getLocaleFromUrl(Request $request): ?string
    {
        $uri = $_SERVER['REQUEST_URI'];

        // 提取路径部分
        $path = parse_url($uri, PHP_URL_PATH);
        $segments = explode('/', trim($path, '/'));

        // 如果路径的第一个部分是有效的语言代码,返回该语言代码
        if (count($segments) > 0 && in_array($segments[0], languages()->toArray())) {
            return $segments[0];
        }

        // 还要从url中的 locale 获取,兼容 app 那边使用 webview 访问 locale传参
        $localeFromUrl = $request->query('locale');
        if ($localeFromUrl && in_array($localeFromUrl, languages()->toArray())) {
            return $localeFromUrl;
        }

        return null;
    }
    */
    private function getLocaleFromUrl(Request $request): ?string
    {
        // 使用Laravel Request对象获取URI,而不是直接访问$_SERVER
        $uri = $request->getRequestUri();

        // 提取路径部分
        $path = parse_url($uri, PHP_URL_PATH);
        $segments = explode('/', trim($path, '/'));

        // 如果路径的第一个部分是有效的语言代码,返回该语言代码
        if (count($segments) > 0 && in_array($segments[0], languages()->toArray())) {
            return $segments[0];
        }

        // 还要从url中的 locale 获取,兼容 app 那边使用 webview 访问 locale传参
        $localeFromUrl = $request->query('locale');
        if ($localeFromUrl && in_array($localeFromUrl, languages()->toArray())) {
            return $localeFromUrl;
        }

        return null;
    }

}
相关推荐
IccBoY12 分钟前
NVM超详细全解教程:解决Node版本冲突(Win/Mac/Linux安装+使用+踩坑合集)
前端·node.js
wuhen_n15 分钟前
前端工程师进阶提示词工程实战
前端·langchain·ai编程
GISer_Jing27 分钟前
Claude Code MCP Server 集成全解析
前端·人工智能·ai·架构
蚰蜒螟27 分钟前
走进 Linux 内核:从 touch 命令到磁盘 inode 的完整旅程
java·linux·前端
因_崔斯汀31 分钟前
用 AI 编程助手从零生成 3D 智慧校园数据大屏 —— Claude Code 实战全记录
前端
前端Hardy31 分钟前
CSS 动画真的比 JS 快?Josh Comeau 做了组实验,结果跟直觉不一样
前端·javascript·后端
自进化Agent智能体37 分钟前
MCP与Hooks:让AI Agent安全连接一切的治理框架
前端
明天一点39 分钟前
Cloudflare 通知转发钉钉机器人
前端·后端
前端Hardy40 分钟前
前端日历组件,要变天了?Schedule-X v4.6 彻底杀疯了
前端·javascript·后端
微扬嘴角1 小时前
React快速入门
前端·react.js·前端框架