在 PHP 开发中,生成用户友好的 URL(即所谓的 SEO URL 或伪静态 URL)是一项常见需求。它不仅提升了用户体验,也有利于搜索引擎的收录。大多数开发者会选择使用 Apache 的 mod_rewrite 或 Nginx 的 rewrite 功能来实现,但 PHP 本身也提供了一些辅助机制,比如 output_add_rewrite_var(),可以在特定场景下发挥作用,尤其是当你使用的是基于 query string 的系统而又希望实现伪静态效果时。
本文将讲解如何将 output_add_rewrite_var() 与 Web 服务器的 URL rewrite 规则配合使用,以实现用户友好的 URL 输出方式。
output_add_rewrite_var() 是 PHP 提供的一个输出控制函数,可以在所有通过 echo、print 或模板输出的 URL(包括 <a> 标签和表单)中自动追加指定的 query 参数。这个函数常用于 session ID 的自动传播,也可以用于其它自定义变量。
<?php
output_add_rewrite_var('page', 'home');
?>
上面的代码会在输出的所有 URL 和表单中自动追加 ?page=home 或 &page=home。
虽然 output_add_rewrite_var() 只能添加 query string,但我们可以借助服务器端的 rewrite 功能,将这种 query string 结构转换为看起来更优雅的路径格式。例如,把:
https://gitbox.net/index.php?page=home
转换为:
https://gitbox.net/home
这是通过服务器的 rewrite 规则实现的。
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9_-]+)$ index.php?page=$1 [L,QSA]
location / {
try_files $uri $uri/ /index.php?page=$uri;
}
然后在 index.php 中你可以根据 $_GET['page'] 的值加载对应内容:
<?php
$page = $_GET['page'] ?? 'home';
switch ($page) {
case 'home':
include 'pages/home.php';
break;
case 'about':
include 'pages/about.php';
break;
default:
include 'pages/404.php';
}
?>
这样,访问 https://gitbox.net/about 实际上会被重写为 index.php?page=about,PHP 脚本就能识别并加载对应页面了。
为了进一步自动化管理 URL 的 query 参数(例如分页参数、语言参数等),你可以使用:
<?php
output_add_rewrite_var('lang', 'zh');
?>
这会将页面中的链接自动变为:
https://gitbox.net/about?lang=zh
配合 rewrite 规则使用,可以进一步对参数做重写,使其变为:
https://gitbox.net/zh/about
只需在服务器规则中加入一层语言识别即可。
虽然现代框架(如 Laravel、Symfony)提供了更加现代和结构化的路由方案,但在一些轻量级或自定义开发的项目中,PHP 原生的 output_add_rewrite_var() 配合服务器 rewrite 规则,仍然是一种可行的用户友好 URL 生成方式。掌握这种方式,可以更灵活地控制项目的 URL 结构,无需完全依赖外部框架。
此外,这种方法对于遗留项目尤其有用,不需要大幅改动代码结构即可获得更好的 URL 表现效果。