PHP路由开发遇$_GET无返回问题:.htaccess配置后无法获取参数
解决PHP路由中$_GET变量未定义的问题
看起来你的路由重写规则没正常生效,导致$_GET['controller']和$_GET['action']出现未定义索引错误,var_dump($_GET)返回空数组。我来帮你一步步排查解决:
1. 先确认Apache的mod_rewrite模块是否启用
这是重写规则生效的核心前提,很多新手容易忽略这一步:
- 打开Apache的配置文件(通常是
httpd.conf),检查是否有LoadModule rewrite_module modules/mod_rewrite.so这一行,并且没有被注释掉(行首没有#)。 - 找到你的站点目录对应的
<Directory>配置块,确保设置了AllowOverride All(不要是AllowOverride None),这样Apache才会读取.htaccess文件中的规则。
修改完配置后记得重启Apache服务。
2. 修复.htaccess中的实体编码错误
你的重写规则里用了&,这是HTML实体编码,但.htaccess是Apache的配置文件,不需要这种编码,直接用普通的&即可。错误的编码会导致参数无法正确拆分,最终$_GET里没有预期的键。
修改后的.htaccess内容应该是:
Options +FollowSymLinks RewriteEngine On RewriteRule ^([a-zA-Z]*)/?([a-zA-Z]*)?/?([a-zA-Z0-9]*)?/?$ index.php?controller=$1&action=$2&id=$3 [NC,L]
3. 测试重写规则是否生效
现在访问http://localhost/Test/View/123,然后在index.php中执行var_dump($_GET),正常情况下应该输出:
array(3) { ["controller"]=> string(4) "Test" ["action"]=> string(4) "View" ["id"]=> string(3) "123" }
4. 处理默认值避免未定义索引错误
当你访问根目录http://localhost/时,controller和action会是空字符串,这时候可以在index.php中设置默认值,防止报错:
// PHP 7及以上版本推荐用空合并运算符 $controller = $_GET['controller'] ?? 'Home'; $action = $_GET['action'] ?? 'index'; // 如果是PHP 5.x版本,用isset判断 // $controller = isset($_GET['controller']) ? $_GET['controller'] : 'Home'; // $action = isset($_GET['action']) ? $_GET['action'] : 'index';
这样就能确保即使没有传入controller或action,也不会出现未定义索引的错误了。
内容的提问来源于stack exchange,提问作者Albin
相关产品推荐
相关产品推荐

