PHP开发中如何隐藏<a>标签href指向的真实PHP文件路径
隐藏PHP项目跳转真实路径的可落地实现方案
方案基础说明
你当前已经在用的?action=read-more形式的跳转,本身就是路径隐藏的核心实现思路,核心逻辑是所有跳转请求都不直接指向真实业务PHP文件,通过统一入口做路径映射转发,从浏览器源码层面完全看不到真实文件的物理路径,还支持完全自定义的伪路径规则。
具体实现步骤
1. 最小改造成本的参数路由模式
不用修改服务器配置,基于现有代码就能直接落地:
- 所有前端跳转链接统一指向项目的公共入口文件(一般是根目录的
index.php),通过GET参数传递要访问的页面标识,绝对不在href里直接写readMore.php这类真实文件路径 - 在公共入口内做路由映射,把传递的标识对应到真实的业务文件,完成内容加载
示例路由代码:
此时前端的a标签只需要写// index.php 统一入口内的路由分发逻辑 $action = $_GET['action'] ?? 'home'; // 配置白名单映射:自定义伪标识 => 真实业务文件路径 $routeConfig = [ 'home' => 'business/home.php', 'read-more' => 'business/readMore.php', 'privacy' => 'business/privacyPolicy.php' ]; // 路由合法性校验,避免非法文件包含风险 if (!array_key_exists($action, $routeConfig)) { http_response_code(404); exit('页面不存在'); } // 加载对应真实业务文件,整个过程浏览器不会感知到真实文件路径 require_once $routeConfig[$action];<a href="?action=read-more" target="_blank" class="moreButton">Read more>></a>,用户查看页面源码只能看到这个带action参数的链接,完全看不到真实的business/readMore.php路径。
2. 自定义纯伪路径模式(无参数结构)
如果觉得带?action=xxx的参数形式不够美观,想要实现比如/go/read-more、/article/123这类完全自定义的路径,只需要配合Web服务器的伪静态规则,把伪路径的请求全部转发到统一入口即可:
- Apache服务器可在Web根目录的
.htaccess文件中配置:RewriteEngine On # 拦截 /go/xxx 格式的请求,转发到index.php处理 RewriteRule ^go/([a-zA-Z0-9-]+)$ index.php?action=$1 [L,QSA] # 拦截 /article/数字 格式的文章详情请求 RewriteRule ^article/([0-9]+)$ index.php?action=read-more&id=$1 [L,QSA] - Nginx服务器可在站点配置块中添加对应重写规则,和上述Apache规则逻辑一致
- 配置完成后,前端a标签就可以直接写纯伪路径:
<a href="/go/read-more" target="_blank" class="moreButton">Read more>></a>,用户查看源码只能看到自定义的伪路径,既暴露不了真实PHP文件路径,也没有明显的参数结构。
必要的安全与规范调整
- 调整项目目录结构,把所有真实业务文件(比如
readMore.php)放到Web服务器的可访问根目录之外,比如Web根目录只保留index.php入口,业务文件全部放在独立的不可直接访问的业务目录中,就算用户猜到真实文件名,也无法直接通过URL访问 - 路由配置必须用白名单映射,绝对不能直接把GET参数的值作为文件路径引入,避免出现文件包含漏洞
- 移除a标签内嵌的button标签,W3C规范不允许a标签嵌套可交互的button元素,会出现点击行为冲突;直接给a标签添加
.moreButton类,通过CSS设置按钮样式即可,示例:<a href="/go/read-more" target="_blank" class="moreButton">Read more>></a>
内容的提问来源于stack exchange,提问作者user3782715
相关产品推荐
相关产品推荐

