增加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;
    }

}
相关推荐
不超限2 分钟前
InfoSuite AS部署Vue项目
前端·javascript·vue.js
程序员小寒3 分钟前
JavaScript设计模式(五):装饰者模式实现与应用
前端·javascript·设计模式
wefly20177 分钟前
零基础上手m3u8live.cn,免费无广告的M3U8在线播放器,电脑手机通用
前端·javascript·学习·电脑·m3u8·m3u8在线播放
晓131312 分钟前
React篇——第四章 React Router基础
前端·javascript·react
Moment13 分钟前
如果想转 AI 全栈?推荐你学一下 Langchain!
前端·后端·面试
cch891816 分钟前
常见布局实现详解(Flex 实战版)
前端·javascript·css
啥都想学点16 分钟前
从 Flutter 前端到 Spring Boot 后端:2026 年技术栈落地路线图(实战版)
前端·spring boot·flutter
telllong17 分钟前
Chrome DevTools Protocol:浏览器自动化入门
前端·自动化·chrome devtools
吴声子夜歌21 分钟前
Node.js——npm包管理器
前端·npm·node.js
小码哥_常22 分钟前
告别启动页“翻车”!Android最新SplashScreen方案全解析
前端