使用$_SERVER["PATH_INFO"]替代GET参数路由时<a>链接路径异常问题排查
你遇到的问题本质是浏览器对相对URL的解析规则导致的。当你的URL是www.universitydomain.subdomain/myProject/index.php/imageGallery时,浏览器会把index.php识别成一个目录名称(而不是PHP文件),此时页面的基准路径就从/myProject/变成了/myProject/index.php/。后续点击相对路径的链接时,浏览器会基于这个新的基准路径拼接URL,就出现了index.php/index.php这种错误路径。
而之前用GET参数的方式(比如index.php?action=imageGallery),浏览器会正确识别index.php是一个文件,基准路径保持为/myProject/,所以相对链接跳转都是正常的。
下面给你几个可行的解决方案:
1. 使用绝对路径链接
直接把所有<a>标签的href改成以根目录开头的绝对路径,这样不管当前页面的基准路径是什么,浏览器都会从网站根目录开始解析:
<a href="/myProject/index.php" > Main page </a> <a href="/myProject/index.php/imageGallery" > Gallery </a> <a href="/myProject/index.php/addImage" > Add image </a>
这个方法简单直接,适合部署路径固定的场景。
2. 页面头部添加<base>标签
在HTML的<head>区域添加<base>标签,明确指定页面所有相对URL的基准路径:
<head> <base href="/myProject/"> </head>
之后你的相对链接就可以保持原来的写法,浏览器会自动基于<base>指定的路径拼接:
<a href="index.php" > Main page </a> <a href="index.php/imageGallery" > Gallery </a> <a href="index.php/addImage" > Add image </a>
⚠️ 注意:如果你的页面里有相对路径引用的资源(比如CSS、JS、图片),也要确保这些路径能基于<base>正确解析,避免资源加载失败。
3. PHP动态生成绝对路径
如果你的项目可能部署在不同的目录下,不想硬写固定路径,可以用PHP动态生成基准URL:
<?php // 生成当前项目的基准URL $baseUrl = 'http://' . $_SERVER['HTTP_HOST'] . dirname($_SERVER['SCRIPT_NAME']) . '/'; ?> <a href="<?php echo $baseUrl; ?>index.php" > Main page </a> <a href="<?php echo $baseUrl; ?>index.php/imageGallery" > Gallery </a> <a href="<?php echo $baseUrl; ?>index.php/addImage" > Add image </a>
这种方式会自动适配当前的部署路径,灵活性更高,适合需要多环境部署的项目。
内容的提问来源于stack exchange,提问作者Tom Clabault

