在 IIS 上部署 PHP 應用時,確認 URL Rewrite 模組(對應 Apache 的 mod_rewrite)是否正確加載並生效,是部署驗證的關鍵步驟。本文提供一個最小化的測試套件,通過「重寫規則跳轉」直觀驗證偽靜態支持。
創建三個文件:
web.config:IIS 重寫規則配置(等同 .htaccess)modrewrite.php:重寫目標頁面,顯示「生效」open_me.php:原始訪問頁面,顯示「不生效」訪問 open_me.php,若規則生效,IIS 會內部重寫到 modrewrite.php,瀏覽器顯示「生效」信息;否則顯示「不生效」。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="TestRewrite" stopProcessing="true">
<match url="^open_me\.php$" />
<action type="Rewrite" url="modrewrite.php" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
<?php
// modrewrite.php
header('Content-Type: text/plain; charset=utf-8');
echo "✅ URL Rewrite 生效!\n";
echo "當前腳本: " . $_SERVER['SCRIPT_NAME'] . "\n";
echo "請求 URI: " . $_SERVER['REQUEST_URI'] . "\n";
?>
<?php
// open_me.php
header('Content-Type: text/plain; charset=utf-8');
echo "❌ URL Rewrite 未生效或未配置。\n";
echo "當前腳本: " . $_SERVER['SCRIPT_NAME'] . "\n";
echo "請求 URI: " . $_SERVER['REQUEST_URI'] . "\n";
?>
https://your-domain/open_me.php。| 現象 | 原因 | 解決 |
|---|---|---|
| 500.19 錯誤 | web.config 語法錯誤、節點未解鎖 | 檢查 XML 格式;IIS 管理器 → 配置編輯器 → system.webServer/rewrite → 解鎖 |
| 規則不生效,直接顯示 open_me.php 內容 | 未安裝 URL Rewrite 模組、或模組未啟用 | 安裝模組;應用程序池設為「集成」模式 |
| 無限循環/500 錯誤 | 規則匹配到自身、stopProcessing 缺失 | 添加 stopProcessing="true";精確匹配模式 |
| PHP 獲取不到原始 REQUEST_URI | IIS 重寫後 $_SERVER['REQUEST_URI'] 可能異常 | 使用 $_SERVER['HTTP_X_ORIGINAL_URL'] 或 $_SERVER['IIS_WasUrlRewritten'] |
<?php
function isUrlRewriteEnabled(): bool
{
// 1. 檢查 IIS 專有變量
if (isset($_SERVER['IIS_WasUrlRewritten']) && $_SERVER['IIS_WasUrlRewritten'] === '1') {
return true;
}
// 2. 檢查 HTTP_X_ORIGINAL_URL (URL Rewrite 模組設置)
if (isset($_SERVER['HTTP_X_ORIGINAL_URL'])) {
return true;
}
// 3. 對比 SCRIPT_NAME 與 REQUEST_URI (通用判斷)
// 重寫後 SCRIPT_NAME 為目標腳本,REQUEST_URI 保持原始請求
if (isset($_SERVER['SCRIPT_NAME'], $_SERVER['REQUEST_URI'])) {
$script = $_SERVER['SCRIPT_NAME'];
$request = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
if ($script !== $request) return true;
}
return false;
}
// 使用
if (isUrlRewriteEnabled()) {
echo "Rewrite 模塊運行正常";
} else {
echo "Rewrite 模塊異常,請檢查配置";
}
?>
<!-- Apache .htaccess -->
RewriteEngine On
RewriteRule ^article/(\d+)\.html$ article.php?id=$1 [L]
<!-- IIS web.config 對應 -->
<rule name="ArticleRewrite">
<match url="^article/(\d+)\.html$" />
<action type="Rewrite" url="article.php?id={R:1}" appendQueryString="true" />
</rule>
$1 → IIS {R:1}。RewriteCond → IIS <conditions> 節點。[L] → stopProcessing="true";[QSA] → appendQueryString="true"。IIS + PHP 的黃金組合是:FastCGI (php-cgi.exe) + URL Rewrite Module + WinCache/OPcache。部署前務必跑通此測試套件,避免上線後偽靜態失效導致 404 洪水。