当前位置: 首页> 最新文章列表> 在 PHP 中使用 output_add_rewrite_var 配合 rewrite_rules 生成友好的 URL

在 PHP 中使用 output_add_rewrite_var 配合 rewrite_rules 生成友好的 URL

gitbox 2025-06-05

在 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()

output_add_rewrite_var() 是 PHP 提供的一个输出控制函数,可以在所有通过 echoprint 或模板输出的 URL(包括 <a> 标签和表单)中自动追加指定的 query 参数。这个函数常用于 session ID 的自动传播,也可以用于其它自定义变量。

<?php
output_add_rewrite_var('page', 'home');
?>

上面的代码会在输出的所有 URL 和表单中自动追加 ?page=home&page=home

配合 Rewrite 规则美化 URL

虽然 output_add_rewrite_var() 只能添加 query string,但我们可以借助服务器端的 rewrite 功能,将这种 query string 结构转换为看起来更优雅的路径格式。例如,把:

https://gitbox.net/index.php?page=home

转换为:

https://gitbox.net/home

这是通过服务器的 rewrite 规则实现的。

Apache 示例

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9_-]+)$ index.php?page=$1 [L,QSA]

Nginx 示例

location / {
    try_files $uri $uri/ /index.php?page=$uri;
}

PHP 处理逻辑

然后在 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 脚本就能识别并加载对应页面了。

使用 output_add_rewrite_var() 自动追加链接参数

为了进一步自动化管理 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 表现效果。