Iis-7

為什麼這個 IIS7 重寫會執行重定向?

  • May 9, 2018

我有一個用 301 重定向響應的重寫規則,但我不知道為什麼。

我在 WinHost 共享主機上,使用 IIS 7 重寫從我的帳戶的子文件夾中託管我擁有的另一個域。

預設情況下,WinHost 將您的其他域指向您帳戶的根目錄。所以我的目標有兩個:

  1. 我想將其他域文件物理上分開保存在子文件夾中
  2. 我想從地址欄中隱藏所述子文件夾

以便:

http://myotherdomain.com

從以下位置獲得服務:

E:\account_root\myotherdomain

所以使用 IIS 7 重寫模組,我生成了這個規則。

<xml version="1.0" encoding="UTF-8"?>
<configuration>
   <system.webServer>
       <rewrite>
           <rules>
               <rule name="Test" stopProcessing="true">
                   <match url="(.*)" />
                   <conditions>
                       <add input="{HTTP_HOST}" pattern="(^|\.)myotherdomain\.com$" />
                   </conditions>
                   <action type="Rewrite" url="myotherdomain/{R:1}" />
               </rule>
           </rules>
       </rewrite>
   </system.webServer>
</configuration>

我希望請求myotherdomain.com偏移到myotherdomain子文件夾中。

這是有效的,但前提是請求中沒有路徑。如果我請求http://myotherdomain.com我收到 200 響應並在我的瀏覽器中看到位於E:\account_root\myotherdomain. 不會發生重定向。

如果您向請求添加路徑,例如http://myotherdomain.com/test,現在我收到 301 重定向到重寫的 URL:

Response: HTTP/1.1 301 Moved Permanently
Location: http://myotherdomain.com/myotherdomain/test/

然後瀏覽器獲取:

Request: GET /myotherdomain/test/ HTTP/1.1

然後重寫規則再次在 IIS 上執行,最終 IIS 嘗試提供位於以下位置的預設文件:

E:\account_root\myotherdomain\myotherdomain\test

哪個不存在:

Response: HTTP/1.1 404 Not Found

所以重寫本身似乎正在工作;我不明白為什麼 IIS 將 301 重定向混入其中,但僅當請求中存在路徑時。

不是重定向以添加尾隨 / 嗎?

正如您所假設的,您的規則看起來是正確的,並且是重寫而不是重定向。在我看來,您網站中的其他內容正在​​導致 301 客戶端重定向。嘗試測試一個 .htm 頁面,看看它是執行重定向的 aspx 還是 htm。您的 URL 重寫規則不會導致這種情況。

你在正確的軌道上。我有幾篇關於這種情況的部落格文章,包括傳出規則:

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