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

PHP 檢測 IIS 環境下 URL Rewrite (偽靜態) 是否生效

     編輯:PHP 相關知識

在 IIS 上部署 PHP 應用時,確認 URL Rewrite 模組(對應 Apache 的 mod_rewrite)是否正確加載並生效,是部署驗證的關鍵步驟。本文提供一個最小化的測試套件,通過「重寫規則跳轉」直觀驗證偽靜態支持。

測試原理

創建三個文件:

  1. web.config:IIS 重寫規則配置(等同 .htaccess)
  2. modrewrite.php:重寫目標頁面,顯示「生效」
  3. open_me.php:原始訪問頁面,顯示「不生效」

訪問 open_me.php,若規則生效,IIS 會內部重寫到 modrewrite.php,瀏覽器顯示「生效」信息;否則顯示「不生效」。

文件內容

1. web.config (放置於站點根目錄)

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

2. modrewrite.php (重寫目標)

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

3. open_me.php (原始入口)

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

驗證步驟

  1. 將三個文件放入同一目錄(站點根目錄或應用入口目錄)。
  2. 確保 IIS 已安裝 URL Rewrite Module 2.0+(官方下載)。
  3. 瀏覽器訪問 https://your-domain/open_me.php。
  4. 顯示「生效」 → Rewrite 正常;顯示「不生效」 → 檢查模組安裝、web.config 權限、應用程序池托管模式(需 Integrated)。

常見故障排查

現象原因解決
500.19 錯誤web.config 語法錯誤、節點未解鎖檢查 XML 格式;IIS 管理器 → 配置編輯器 → system.webServer/rewrite → 解鎖
規則不生效,直接顯示 open_me.php 內容未安裝 URL Rewrite 模組、或模組未啟用安裝模組;應用程序池設為「集成」模式
無限循環/500 錯誤規則匹配到自身、stopProcessing 缺失添加 stopProcessing="true";精確匹配模式
PHP 獲取不到原始 REQUEST_URIIIS 重寫後 $_SERVER['REQUEST_URI'] 可能異常使用 $_SERVER['HTTP_X_ORIGINAL_URL'] 或 $_SERVER['IIS_WasUrlRewritten']

進階:PHP 代碼中檢測 Rewrite 狀態

<?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 到 IIS web.config

<!-- 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>
  • 正則捕獲組:Apache $1 → IIS {R:1}。
  • 條件判斷:Apache RewriteCond → IIS <conditions> 節點。
  • 標誌位:[L] → stopProcessing="true";[QSA] → appendQueryString="true"。
IIS + PHP 的黃金組合是:FastCGI (php-cgi.exe) + URL Rewrite Module + WinCache/OPcache。部署前務必跑通此測試套件,避免上線後偽靜態失效導致 404 洪水。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved