2011-04-05 64 views
7

我正在設置IIS 7.5來爲我的站點的子目錄做反向代理。使用ARR的IIS反向代理與目錄級別有關的問題

這裏是web.config中的URL重寫:

<clear /> 
<rule name="Reverse Proxy to Community" stopProcessing="true"> 
<match url="^community/qa/(.*)" /> 
<action type="Rewrite" url="http://xxx.xxx.xxx.xxx/{R:1}" logRewrittenUrl="true" /> 
</rule> 

的IP地址指向與Apache和Django的網站聯網的Linux機器。

我想
用於/社區/ QA所有要求什麼/ *重定向到指定的內部IP。

會發生什麼
/社區/ QA/- 提供了404(上主IIS服務器)
/社區/ QA /問題/ - 提供了404(上主IIS服務器)
- 但是 -
/community/qa/questions/ask/Works !!!
/community/qa/questions/unanswered/Works !!

因此,它似乎適用於所有從2個子目錄深入起始的URL。

這對我來說似乎很奇怪,我無法弄清楚。

在此先感謝您的幫助。

回答

14

我很確定在你的情況下,問題是在UrlRoutingModule設置。如果您查看有序視圖中的IIS模塊設置,您將看到UrlRoutingModule被放置得更高,然後RewriteApplicationRequestRouting模塊被放置。這意味着如果你在你的應用程序中有ASP.NET MVC的Route-setup。這種設置會影響服務器攔截它們並將它們轉發到MVC-Route-Handlers的請求,而不允許反向代理執行它的工作。例如,如果你有共同的路線設置是這樣的:

routes.MapRoute(
    "Default", // Route name 
    "{controller}/{action}/{id}", // URL with parameters 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
); 

在你的情況/community/qa//community/qa/questions/不會工作,因爲它會匹配給定的URL模式,會被解釋爲:

/社區/QA/--->控制器= 「社區」,動作= 「QA

/社區/QA/問題/--->控制器= 「社區」,行動= 「QA」,參數:ID爲 「問題

如果你沒有這樣的控制器和操作,你會得到HTTP 未找到。

/community/qa/questions/ask//community/qa/questions/unanswered/會工作,因爲它們不匹配您的系統中的任何UrlRouting模式。

那麼簡單的辦法就是在你UrlRouting配置中添加(Web應用程序啓動時),忽略規則的網址:

routes.IgnoreRoute("community/qa/{*pathInfo}"); 
+0

謝謝! url重寫的順序有幫助! – 2014-06-16 01:10:45