如何通过index.php路由加载视图页面,避免404错误?
解决方法
1. 修改页面链接格式
把原来的 <a href='page1.php'> 改成 <a href='page1'> 或者带根路径的 <a href='/page1'>,点击后URL会变成 mydomain.com/page1,避免直接指向根目录不存在的文件。如果非要保留.php后缀(比如<a href='page1.php'>),后续服务器配置要对应调整。
2. 配置服务器重写规则
通过服务器规则,让所有非真实文件/目录的请求都转发到index.php处理:
Apache服务器
在网站根目录创建.htaccess文件,写入以下内容:
RewriteEngine On # 跳过真实存在的文件和目录(比如assets里的css/js) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 将请求转发到index.php,同时传递URL路径参数 RewriteRule ^(.*)$ index.php?path=$1 [L,QSA]
如果要支持.php后缀的链接,把最后一行改成:
RewriteRule ^(.*)\.php$ index.php?path=$1 [L,QSA]
Nginx服务器
在站点配置的server块中添加规则:
location / { # 优先访问真实文件/目录,否则转发到index.php try_files $uri $uri/ /index.php?$args; }
若要支持.php后缀链接,可追加:
location ~* \.php$ { try_files $uri /index.php?$args; fastcgi_pass 127.0.0.1:9000; # 此处根据你的PHP-FPM配置调整 fastcgi_index index.php; include fastcgi_params; }
3. 调整index.php的视图加载逻辑
修改index.php中读取路径、加载视图的代码,保证能正确获取页面名,同时做安全校验防止非法访问:
// 获取请求的路径参数(Apache用$_GET['path'],Nginx可直接解析REQUEST_URI) $requestPath = $_GET['path'] ?? ''; // 过滤非法字符,防止目录遍历攻击 $safePath = preg_replace('/[^a-zA-Z0-9_\-]/', '', $requestPath); // 拼接视图文件路径 $viewFile = __DIR__ . '/views/' . $safePath . '.php'; // 检查文件是否存在,存在则加载,否则返回404 if (file_exists($viewFile) && is_file($viewFile)) { include $viewFile; } else { http_response_code(404); // 可加载自定义404视图 include __DIR__ . '/views/404.php'; }
如果是支持.php后缀的场景,$_GET['path']已为page1(来自重写规则),直接使用上述拼接逻辑即可。
内容的提问来源于stack exchange,提问作者user20419120
相关产品推荐
相关产品推荐

