Iis

防止 URL 重寫規則被 IIS7 中的子目錄繼承

  • February 23, 2018

我有一個用於 CMS 中乾淨 URL 的 URL 重寫設置,我的 web.config 如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
   <system.webServer>
       <rewrite>
           <rules>
               <rule name="Clean URLs" stopProcessing="true">
                   <match url="^([^/]+)/?$" />
                   <conditions>
                       <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                       <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                   </conditions>
                   <action type="Rewrite" url="?id={R:1}" />
               </rule>
           </rules>
       </rewrite>
   </system.webServer>
</configuration>

它基本上變成index.php?id=somethingsomething乾淨的 URL。非常簡單,而且效果很好。

在 CMS 中很常見,為了防止後端中斷,每個子目錄都需要web.config<remove name="Clean URLs" /><clear />在其 web.config 中,因此不會繼承規則。

有沒有辦法通過某種方式將規則的範圍限制為僅目前目錄,在父規則中指定它根本不應該被其子規則繼承?像<rule name="Clean URLs" stopProcessing="true" inherit="no">史詩般的東西。

經過 4.5 小時的Google搜尋後找到了答案!

http://runtingsproper.blogspot.co.uk/2010/04/solved-breaking-parent-webconfig.html

基本上利用

<location path="." inheritInChildApplications="false"> 
   <system.webServer>
       <!-- ... -->
   </system.webServer>
</location>

我最近在類似的情況下遇到了這個問題。但是 rjenkins 的回答似乎會導致依賴於父設置繼承的虛擬應用程序出現問題。

如果您知道重寫規則的名稱,您可以這樣做:

<rewrite>
 <rules>
   <remove name="RewriteNameToDisable" />
 </rules>
</rewrite>

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