PHP路由项目出现Undefined index: BASE_URI报错该如何解决?
报错原因
你通过 .htaccess 的 E=BASE_URI 语法设置的是Apache服务端环境变量,部分Apache配置下该变量不会自动注入到PHP的$_SERVER超全局数组中;另外你当前的重写规则仅能匹配项目部署在子目录的场景,当项目直接放在Web根目录时规则无法命中,也会导致BASE_URI未被赋值。
可选解决方案
方案1:在PHP入口文件统一定义(最稳妥,不受服务器配置影响)
在项目入口文件public/index.php的最顶部添加如下代码:
// 自动计算项目根路径对应的BASE_URI $baseUri = dirname($_SERVER['SCRIPT_NAME']); // 统一格式,保证末尾带斜杠 $baseUri = rtrim($baseUri, '/') . '/'; // 定义为全局常量方便全局调用 define('BASE_URI', $baseUri); // 兼容原有写法,赋值到$_SERVER数组 $_SERVER['BASE_URI'] = BASE_URI;
添加完成后原有代码无需修改即可正常运行。
方案2:修改.htaccess规则
把原动态生成BASE_URI的规则替换为固定赋值,适配你的项目路径:
RewriteEngine On # 固定设置BASE_URI,子目录部署填对应子目录路径,根目录部署直接填/ RewriteRule ^(.*) - [E=BASE_URI:/myproject/] # 原有请求转发规则保留 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L]
方案3:取值时加兜底兼容
如果不想修改全局配置,也可以直接修改MainController第39行的代码,加空值判断:
// 兜底路径按实际部署路径修改,根目录填/,子目录填对应路径如/myproject/ $viewVars['baseURL'] = $_SERVER['BASE_URI'] ?? '/';
内容的提问来源于stack exchange,提问作者Rolek
相关产品推荐
相关产品推荐

