You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用PHP不创建实际目录实现类似/users/USERNAME的子路径链接

实现原理:URL重写(伪静态)机制

这类美观的路径结构本质是Web服务器的请求重写能力实现的,不需要创建对应实体目录,整体逻辑对用户侧完全透明:
当用户请求符合规则的路径时,服务器不会真的去磁盘检索对应路径的文件/目录,而是直接把请求转发到预设的后端处理脚本,同时把路径中的动态片段提取为参数传给脚本,后端的处理逻辑和你用?userid=int参数的方案完全一致。


针对你的PHP场景具体实现

你的目录结构只需要配合服务器加一层重写规则即可,不需要调整现有业务逻辑:

1. Apache 服务器配置

在站点根目录新建.htaccess文件,添加如下规则:

RewriteEngine On
# 匹配 /users/任意用户名 格式的请求
RewriteRule ^users/([^/]+)/?$ users/users-template.php?username=$1 [L]

规则说明:

  • ([^/]+)是正则匹配,会提取users/后的第一段路径内容作为$1变量
  • [L]表示匹配到该规则后停止后续重写逻辑
  • 最终请求会被转发到users-template.php,同时路径中的用户名会被作为username GET参数传入

2. Nginx 服务器配置

在站点的Nginx配置server块中添加如下规则:

rewrite ^/users/([^/]+)/?$ /users/users-template.php?username=$1 last;

配置完成后重载Nginx服务即可生效。

3. PHP脚本获取参数

在users-template.php中直接用常规GET参数方式即可拿到路径中的用户名:

<?php
$username = $_GET['username'];
// 后续查询数据库、渲染模板的逻辑和之前用?userid参数的方案完全一致
?>

主流站点的实现逻辑

你提到的YouTube、Stack Overflow的路径逻辑完全相同:

  • Stack Overflow的stackoverflow.com/questions/QuesId/QuesName路径,重写规则会提取路径中的数字QuesId作为查询参数传给问题详情模板,末尾的QuesName仅用于提升URL可读性,即使修改为任意内容只要QuesId正确,依然可以访问对应问题。
  • YouTube的youtube.COM/Channel/ChannelId路径,同理是提取ChannelId作为参数传给频道页模板,不需要为每个频道创建实体目录。

进阶方案:框架路由

如果使用Laravel、ThinkPHP等现代PHP框架,不需要手动写服务器重写规则,框架自带的路由功能已经封装了底层逻辑,只需要在路由配置中定义规则即可:

// 示例:Laravel路由定义
Route::get('/users/{username}', [UserController::class, 'show']);

控制器中可以直接拿到解析后的username参数,比手动配置服务器规则更灵活。

内容的提问来源于stack exchange,提问作者winpriv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 15:27:03