You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bramus Router在MVC架构下URL重写后404问题求助

解决Bramus/Router在MVC结构下的404问题

问题原因

Bramus/Router会依据$_SERVER["SCRIPT_NAME"]确定路由的基准前缀。当通过根目录的.htaccess将请求转发到public/index.php时,$_SERVER["SCRIPT_NAME"]会被设置为/public/index.php,导致Router错误地把/public当作路由基准路径,无法匹配你定义的路由规则,最终出现404错误。

可行解决方法

方法1:手动指定Router的基准路径

在public/index.php中初始化Router时,调用setBasePath方法将基准路径设为空字符串,强制Router忽略/public前缀:

$router = new \Bramus\Router\Router();
// 重置基准路径,让路由匹配根路径规则
$router->setBasePath('');

// 示例路由定义
$router->get('/', function() {
    echo '首页';
});

$router->run();

方法2:修改.htaccess并重置SERVER变量

调整根目录的.htaccess,添加环境变量传递原始请求路径,然后在public/index.php中重置SCRIPT_NAME:
根目录.htaccess:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ public/index.php [L,E=ORIG_URI:/$1]

public/index.php开头添加:

// 修正SCRIPT_NAME为根目录的index.php
$_SERVER['SCRIPT_NAME'] = '/index.php';
// 同步修正REQUEST_URI为原始请求路径
if (isset($_SERVER['REDIRECT_ORIG_URI'])) {
    $_SERVER['REQUEST_URI'] = $_SERVER['REDIRECT_ORIG_URI'];
}

方法3:调整目录与.htaccess结构

将路由重写规则移到public目录下,根目录仅负责转发请求到public:
根目录.htaccess:

RewriteEngine On
RewriteRule ^(.*)$ public/$1 [L]

public目录新建.htaccess:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L]

此时$_SERVER["SCRIPT_NAME"]为/public/index.php,需要在Router初始化时设置基准路径为/public:

$router->setBasePath('/public');

内容的提问来源于stack exchange,提问作者apprentice

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 13:53:00