如何根据输入的URL从MySQL中获取对应条目,实现类似维基百科的友好URL访问效果?
维基百科路径式URL实现原理
核心依托*URL重写(URL Rewrite)*技术实现,本质上和你用GET参数传递条目名的逻辑没有差异,只是通过服务端配置把参数从URL的query部分移到了路径段里,用户感知不到内部转发过程。
基础实现流程
- 首先Web服务器(维基底层用的是Apache/Nginx)会预设重写规则,匹配
/wiki/开头的路径请求,把/wiki/后面的内容提取为条目名参数,内部转发给后端的内容处理脚本,整个过程不会改变浏览器地址栏的显示内容。
以Nginx为例,核心配置参考如下:
location /wiki/ { # 把/wiki/后的所有内容赋值给title参数,转发给index.php处理 rewrite ^/wiki/(.*)$ /index.php?title=$1 last; }
- 后端脚本拿到传入的title参数后,和你之前用GET参数获取
article_name的处理逻辑完全一致,去数据库或者内容库查询对应条目内容,组装成页面返回给浏览器即可。
维基百科的额外适配优化
- 多语言适配:通过域名前缀(比如zh、en)先识别用户请求的语言版本,再结合条目名定位对应语言的条目,避免不同语言的同名条目冲突。
- 特殊字符兼容:重写规则和后端逻辑会统一处理路径中的空格、特殊符号、大小写,和数据库存储的条目名做归一化匹配,降低访问失败概率。
- 缓存优化:这种规则统一的静态路径更容易接入CDN、服务端静态缓存,大部分用户请求可以直接命中缓存返回,不用每次请求后端处理脚本,访问性能更高。
你可以直接复用的落地步骤
- 给你的站点Web服务器配置对应重写规则,把
/wiki/xxx格式的请求转发到你的PHP处理脚本,提取xxx作为条目参数 - 后端PHP逻辑不需要做太大改动,直接复用之前处理GET参数的逻辑即可返回对应内容
- 可以额外加301重定向规则,把原来带
?article_name参数的旧URL重定向到新的路径式URL,避免内容重复收录。
内容的提问来源于stack exchange,提问作者Kinglui11
相关产品推荐
相关产品推荐

