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

}
相关推荐
清山博客19 小时前
OpenCV 人脸识别和比对工具
前端·webpack·node.js
要加油哦~19 小时前
AI | 实践教程 - ScreenCoder | 多agents前端代码生成
前端·javascript·人工智能
程序员Sunday19 小时前
说点不一样的。GPT-5.3 与 Claude Opus 4.6 同时炸场,前端变天了?
前端·gpt·状态模式
yq19820430115619 小时前
静思书屋:基于Java Web技术栈构建高性能图书信息平台实践
java·开发语言·前端
aPurpleBerry19 小时前
monorepo (Monolithic Repository) pnpm rush
前端
青茶36019 小时前
php怎么实现订单接口状态轮询请求
前端·javascript·php
鹏北海20 小时前
micro-app 微前端项目部署指南
前端·nginx·微服务
发现一只大呆瓜20 小时前
虚拟列表:从定高到动态高度的 Vue 3 & React 满分实现
前端·vue.js·react.js
css趣多多20 小时前
add组件增删改的表单处理
java·服务器·前端
证榜样呀20 小时前
2026 大专计算机专业必考证书推荐什么
大数据·前端