利用 PHP 內置 $_SERVER['PATH_INFO'] 變量獲取「腳本路徑之後」的部分。
https://example.com/show_new.php/look-id-1.shtml
$_SERVER['PATH_INFO'] 將返回 /look-id-1.shtml
<?php
$pdo = new PDO('mysql:host=localhost;dbname=tb_demo', 'root', 'root');
$pdo->exec('SET NAMES utf8');
$stmt = $pdo->query('SELECT * FROM news');
echo '<h1>新聞列表</h1>';
echo '<a href="add_news.html">添加新聞</a><hr/>';
echo '<table><tr><th>ID</th><th>標題</th><th>操作</th></tr>';
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
// 偽靜態 URL 生成
$url = "show_new.php/look-id-{$row['id']}.shtml";
echo "<tr><td>{$row['id']}</td><td>{$row['title']}</td>";
echo "<td><a href='$url'>查看詳情</a></td></tr>";
}
echo '</table>';
?>
<?php
header('Content-Type: text/html; charset=utf-8');
$pdo = new PDO('mysql:host=localhost;dbname=tb_demo', 'root', 'root');
$pdo->exec('SET NAMES utf8');
$pathInfo = $_SERVER['PATH_INFO'] ?? '';
// 正則解析 /look-id-123.shtml
if (preg_match('#^/look-id-(\d+)\.shtml$#', $pathInfo, $matches)) {
$id = (int)$matches[1];
$stmt = $pdo->prepare('SELECT * FROM news WHERE id = ?');
$stmt->execute([$id]);
$news = $stmt->fetch(PDO::FETCH_ASSOC);
if ($news) {
echo $news['title'] . '<hr>' . $news['content'];
} else {
echo '文章不存在';
}
} else {
echo 'URL 格式不合法';
}
?>
完全隱藏 PHP 後綴,URL 更美觀、利於 SEO。
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^news/(\d+)\.html$ show_new.php?id=$1 [L,QSA]
location / {
try_files $uri $uri/ /show_new.php?$query_string;
}
# 或精確匹配
rewrite ^/news/(\d+)\.html$ /show_new.php?id=$1 last;
<?php // 直接使用 $_GET['id'] $id = isset($_GET['id']) ? (int)$_GET['id'] : 0; // ... 查詢數據庫輸出 ?>
| 維度 | PATH_INFO | Rewrite |
|---|---|---|
| 服務器配置 | 無需配置 | 需開啟 mod_rewrite / 配置 Nginx |
| URL 美觀度 | 帶 .php 後綴 | 完全靜態化外觀 |
| SEO 友好度 | 一般 | 優秀 |
| 調試便利性 | 直觀 | 需查看重寫日誌 |
| 適用場景 | 快速原型、虛擬主機無權限 | 正式項目、生產環境 |
index.php,配合路由分發AcceptPathInfo On(Apache)確保 PATH_INFO 可用作備選url($route, $params) 助手函數掌握雙方案,根據部署環境靈活選擇,輕鬆實現專業級偽靜態架構。