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
相关产品推荐
相关产品推荐

