在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 表現效果。