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

}
相关推荐
码途潇潇9 小时前
JavaScript有哪些数据类型?如何判断一个变量的数据类型?
前端·javascript
满天星辰9 小时前
Vue真的是单向数据流?
前端·vue.js
细心细心再细心9 小时前
Nice-modal-react的使用
前端
我的写法有点潮10 小时前
JS中对象是怎么运算的呢
前端·javascript·面试
悠哉摸鱼大王10 小时前
NV12 转 RGB 完整指南
前端·javascript
一壶纱10 小时前
UniApp + Pinia 数据持久化
前端·数据库·uni-app
双向3310 小时前
【RAG+LLM实战指南】如何用检索增强生成破解AI幻觉难题?
前端
海云前端110 小时前
前端人必懂的浏览器指纹:不止是技术,更是求职加分项
前端
青莲84310 小时前
Java内存模型(JMM)与JVM内存区域完整详解
android·前端·面试
parade岁月10 小时前
把 Git 提交变成“可执行规范”:Commit 规范体系与 Husky/Commitlint/Commitizen/Lint-staged 全链路介绍
前端·代码规范