Iis

將子目錄下的重寫規則從 Apache 遷移到 IIS

  • March 4, 2016

在舊的 Apache 主機中,我們有以下.htaccess文件public_html/adm

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /adm/index.php [L]
</IfModule>

如果路徑不存在,這應該將子目錄之後的每個 url 重定向adm到文件。/adm/index.php並且工作得很好。

然後我將此網站遷移到 IIS (v8.5),並使用“導入規則…”工具,我試圖達到相同的效果,但起初它與/adm路徑下的 URL 不同。為了克服這個問題,我.htaccess稍微更改了原始文件,如下所示:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond adm/%{REQUEST_FILENAME} !-f
RewriteCond adm/%{REQUEST_FILENAME} !-d
RewriteRule adm/. /adm/index.php [L]
</IfModule>

生成的 IIS 規則如下:

<rewrite>
   <rules>
       <rule name="Imported Rule 1" enabled="true" stopProcessing="true">
           <match url="adm/." ignoreCase="false" />
           <conditions logicalGrouping="MatchAll">
               <add input="adm/{REQUEST_FILENAME}" matchType="IsFile" pattern="" ignoreCase="true" negate="true" />
               <add input="adm/{REQUEST_FILENAME}" matchType="IsDirectory" pattern="" ignoreCase="true" negate="true" />
           </conditions>
           <action type="Rewrite" url="/adm/index.php" />
       </rule>
   </rules>
</rewrite>

起初它似乎工作(1),但我很快注意到有效路徑也被重定向(2)。怎樣才能讓它正常工作?

  1. http://example.com/aaaa返回 404 錯誤,並http://example.com/adm/aaaa返回http://example.com/adm/index.php(這是預期的) 的內容。
  2. http://example.com/adm/images/logo.png,這是一個有效的路徑,返回 index.php 文件的內容(這是錯誤的)。

這是web.config文件中重寫規則的結果。 iis 重寫規則的視圖

謝謝。

不滿足匹配條件。這是由於adm/在他們前面添加了(錯誤的)。

REQUEST_FILENAME 伺服器變數的值是文件系統上被請求的文件(或目錄)的完整路徑。在我的特定測試案例中:

請求網址: http://example.com/adm/images/logo.png

{REQUEST_FILENAME}F:\IIS\example.com\adm\assets\img\logo.png

出於顯而易見的原因,adm/在該值前面追加將使其成為無效的文件系統路徑,因此,即使對於有效的文件/目錄,也會強制執行重寫規則。解決方案很簡單:

正確的重寫規則

即使出於完美主義,過濾模式也可以更新為有效的正則表達式語法,因為僅上一步就足以解決手頭的問題。

新的正則表達式語法

更新web.config文件的規則如下。

<rewrite>
   <rules>
       <rule name="Imported Rule 1" enabled="true" stopProcessing="true">
           <match url="(adm\/).*" ignoreCase="false" />
           <conditions logicalGrouping="MatchAll">
               <add input="{REQUEST_FILENAME}" matchType="IsFile" pattern="" ignoreCase="true" negate="true" />
               <add input="{REQUEST_FILENAME}" matchType="IsDirectory" pattern="" ignoreCase="true" negate="true" />
           </conditions>
           <action type="Rewrite" url="/adm/index.php" />
       </rule>
   </rules>
</rewrite>

您的正則表達式不正確。它與之後的整個值不匹配/

的結果adm/.返回 的匹配項adm/i。所以假設文件不存在是正確的。

你的正則表達式應該是:adm/.*

在 IIS GUI 中創建規則時,點擊Test Pattern該部分中的按鈕Match URL以查看結果。

引用自:https://serverfault.com/questions/761087