Iis
將子目錄下的重寫規則從 Apache 遷移到 IIS
在舊的 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)。怎樣才能讓它正常工作?
http://example.com/aaaa
返回 404 錯誤,並http://example.com/adm/aaaa
返回http://example.com/adm/index.php
(這是預期的) 的內容。http://example.com/adm/images/logo.png
,這是一個有效的路徑,返回 index.php 文件的內容(這是錯誤的)。謝謝。
不滿足匹配條件。這是由於
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
以查看結果。