PHP控制器文件夹路由与URL解析配置问题求助
解决PHP简洁URL路由404问题
1. 补全URL变量的定义
你的路由代码里直接使用了$url变量但未定义,这会导致匹配逻辑完全失效。先在路由代码开头添加URL获取与处理逻辑:
// 获取请求URI并去除查询参数(比如?xxx=yyy这类内容) $url = strtok($_SERVER['REQUEST_URI'], '?'); // 统一处理尾部斜杠,避免/contact和/contact/出现匹配差异 $url = rtrim($url, '/') . '/';
2. 配置服务器重写规则(核心步骤)
服务器默认会直接查找请求路径对应的文件/目录,不会把请求转发到项目根目录的index.php,这是简洁URL出现404的根本原因,需要配置重写规则:
Apache服务器(.htaccess)
在/tuto-php目录下创建.htaccess文件,写入以下内容:
RewriteEngine On # 仅当请求的不是真实文件/目录时,转发到index.php RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php [L]
Nginx服务器
在站点配置的server块中添加:
location /tuto-php { try_files $uri $uri/ /tuto-php/index.php?$query_string; }
3. 优化路由匹配逻辑
修改后的完整路由代码示例:
<?php // 获取并标准化请求URL $url = strtok($_SERVER['REQUEST_URI'], '?'); $url = rtrim($url, '/') . '/'; if ($url === '/tuto-php/') { require 'controllers/index.php'; } else if ($url === '/tuto-php/contact/') { require 'controllers/contact.php'; } else if ($url === '/tuto-php/about/') { require 'controllers/about.php'; } else { // 处理404场景 http_response_code(404); // 可按需引入404视图文件 // require 'views/404.view.php'; }
额外验证点
- 确认Apache开启了
mod_rewrite模块,Nginx配置修改后需重启服务 - 检查
controllers目录下的文件路径是否与require语句的相对路径匹配(基于根目录index.php的位置) - 调试时可临时添加
var_dump($url),查看实际匹配的URL是否符合预期
内容的提问来源于stack exchange,提问作者D0R14N
相关产品推荐
相关产品推荐

