首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 偽靜態實現的兩大核心方案:PATH_INFO 與 Rewrite

     編輯:PHP 綜合知識

方案一:PATH_INFO 模式(無需服務器配置)

利用 PHP 內置 $_SERVER['PATH_INFO'] 變量獲取「腳本路徑之後」的部分。

訪問示例

https://example.com/show_new.php/look-id-1.shtml

$_SERVER['PATH_INFO'] 將返回 /look-id-1.shtml

入口文件 index.php

<?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>';
?>

處理文件 show_new.php

<?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 格式不合法';
}
?>

方案二:Apache mod_rewrite / Nginx Rewrite(推薦生產環境)

完全隱藏 PHP 後綴,URL 更美觀、利於 SEO。

Apache .htaccess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^news/(\d+)\.html$ show_new.php?id=$1 [L,QSA]

Nginx 配置

location / {
    try_files $uri $uri/ /show_new.php?$query_string;
}

# 或精確匹配
rewrite ^/news/(\d+)\.html$ /show_new.php?id=$1 last;

PHP 統一入口獲取參數

<?php
// 直接使用 $_GET['id']
$id = isset($_GET['id']) ? (int)$_GET['id'] : 0;
// ... 查詢數據庫輸出
?>

兩種方案對比

維度PATH_INFORewrite
服務器配置無需配置需開啟 mod_rewrite / 配置 Nginx
URL 美觀度帶 .php 後綴完全靜態化外觀
SEO 友好度一般優秀
調試便利性直觀需查看重寫日誌
適用場景快速原型、虛擬主機無權限正式項目、生產環境

最佳實踐建議

  1. 新項目首選 Rewrite 方案,URL 乾淨無後綴
  2. 統一入口文件 index.php,配合路由分發
  3. 設置 AcceptPathInfo On(Apache)確保 PATH_INFO 可用作備選
  4. 所有內部鏈接生成封裝為 url($route, $params) 助手函數

掌握雙方案,根據部署環境靈活選擇,輕鬆實現專業級偽靜態架構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved