Обратный прокси-сервер IIS с использованием ARR, имеющий проблемы с уровнями каталогов - PullRequest
7 голосов
/ 05 апреля 2011

Я работаю над настройкой IIS 7.5 для создания обратного прокси-сервера для подкаталога моего сайта.

Вот перезапись URL web.config:

<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-адрес указывает на сетевой ящик linux с apache и сайтом django.

Что я хочу
Весь запрос на перенаправление / community / qa / * на указанный внутренний IP-адрес.

Что происходит
/ community / qa / - дает 404 (на главном сервере IIS)
/ community / qa / questions / - дает 404 (на главном сервере IIS)
- НО -
/ сообщество / вопрос / вопросы / спросить / работает !!!
/ сообщество / вопрос / вопросы / без ответа / работает !!

Таким образом, похоже, что он работает для всех URL, которые находятся в 2 подкаталогах глубоко от начальной точки.

Мне это кажется странным, и я не могу понять это.

Заранее спасибо за любую помощь.

1 Ответ

14 голосов
/ 06 апреля 2011

Я совершенно уверен, что в вашем случае проблема в настройке UrlRoutingModule. Если вы посмотрите на «Настройка модулей IIS» в упорядоченном виде, то увидите, что UrlRoutingModule расположен выше, чем Rewrite и ApplicationRequestRouting. Это означает, что если в вашем приложении есть Route-setup для ASP.NET MVC. Эта настройка будет влиять на запросы, поступающие на сервер, перехватывая их и перенаправляя их в 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 / ---> Controller = " сообщество ", Action = " qa"

/ сообщество / qa / вопросы / ---> Controller = " сообщество ", Действие = " qa ", параметр: Id = " questions "

Если у вас нет таких контроллеров и действий, вы получите Http 404 Not Found.

/community/qa/questions/ask/ и /community/qa/questions/unanswered/ будут работать, потому что они не соответствуют ни одному шаблону UrlRouting в вашей системе.

Столь простое решение - добавить в конфигурацию UrlRouting (при запуске веб-приложения) правило игнорирования для вашего URL:

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