使用Pretty-URL路由时CSS文件无法加载的问题求助
解决MVC路由误解析静态资源的问题
这个问题太常见了——你的路由现在会把所有请求都抓过来解析,包括CSS、JS这类静态资源的请求,所以当浏览器请求/mvc/public/css/style.css时,路由把public当成了控制器名,css当成了方法,自然找不到对应的控制器文件就报错了。
给你几个实用的解决方案,按优先级排序:
1. 用服务器配置跳过静态资源路由(推荐)
这是效率最高的方案,让服务器直接返回静态资源,根本不经过PHP的路由逻辑。
Apache环境(.htaccess)
在你的项目根目录(/mvc/下)创建或修改.htaccess文件,添加以下规则:
RewriteEngine On # 如果请求的是存在的文件/目录,直接返回,不走路由 RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^ - [L] # 其他所有请求转发到index.php处理 RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
原理:服务器先检查请求的路径是否对应真实存在的文件或目录,如果是,直接返回内容;只有当文件/目录不存在时,才把请求交给index.php的Bootstrap路由处理。
Nginx环境
修改你的Nginx站点配置,在server块里添加:
location /mvc/ { # 先尝试返回真实文件/目录,失败再转发到index.php try_files $uri $uri/ /mvc/index.php?url=$uri; }
2. 在Bootstrap路由里提前拦截静态资源
如果没有权限修改服务器配置(比如用虚拟主机),可以在PHP路由逻辑里先判断是否是静态资源请求,提前处理:
修改Bootstrap类的__construct方法,在最开头添加静态资源判断逻辑:
function __construct() { // 新增:拦截public目录下的静态资源请求 $requestUri = $_SERVER['REQUEST_URI']; $staticDirPrefix = '/mvc/public/'; if (str_starts_with($requestUri, $staticDirPrefix)) { // 拼接服务器上的真实文件路径 $filePath = $_SERVER['DOCUMENT_ROOT'] . $requestUri; if (file_exists($filePath)) { // 设置正确的MIME类型,确保浏览器能正确解析资源 $mime = mime_content_type($filePath); header("Content-Type: $mime"); // 输出文件内容并终止脚本 readfile($filePath); exit; } } // 原来的路由逻辑保持不变 $url = isset($_GET['url'])?$_GET['url']:null; $url = rtrim($url,'/'); $url = explode('/', $url); // ... 剩下的代码省略 }
注意:PHP 8.0+支持str_starts_with,如果是低版本PHP,可以用substr($requestUri, 0, strlen($staticDirPrefix)) === $staticDirPrefix替代。
3. 确保视图里用正确的资源路径
配合上面的方案,在视图里引用静态资源时,尽量用基于站点根目录的绝对路径,避免相对路径带来的问题:
<!-- 直接用绝对路径 --> <link rel="stylesheet" href="/mvc/public/css/style.css"> <!-- 或者用PHP动态输出根路径,避免硬编码 --> <?php $baseUrl = '/mvc/'; ?> <link rel="stylesheet" href="<?php echo $baseUrl; ?>public/css/style.css">
内容的提问来源于stack exchange,提问作者Rakesh Kohali
相关产品推荐
相关产品推荐

