#asp.net #asp.net-mvc #iis #url-rewriting #reverse-proxy
#asp.net #asp.net-mvc #iis #перезапись URL-адреса #обратный прокси
Вопрос:
Я работаю над настройкой 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)
— НО —
/community/qa/questions/ask/ Работает!!!
/сообщество / qa/вопросы / без ответа / Работает!!
Таким образом, кажется, что это работает для всех URL-адресов, которые находятся в 2 подкаталогах в глубину от начальной точки.
Мне это просто кажется странным, и я не могу в этом разобраться.
Заранее спасибо за любую помощь.
Ответ №1:
Я совершенно уверен, что в вашем случае проблема заключается в UrlRoutingModule
настройке. Если вы посмотрите на настройку модулей IIS в упорядоченном виде, вы увидите, что это UrlRoutingModule
расположено выше, чем Rewrite
и ApplicationRequestRouting
расположены модули. Это означает, что если у вас в вашем приложении есть настройка маршрута для 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/ —> Контроллер=»сообщество«, Действие = «qa«
/сообщество/ qa/ вопросы/ —> Контроллер=»сообщество«, Действие = «qa«, параметр: Id=»вопросы«
Если у вас нет таких контроллеров и действий, вы получите Http 404 Not Found.
/community/qa/questions/ask/
и /community/qa/questions/unanswered/
будет работать, потому что они не соответствуют ни одному шаблону маршрутизации URL в вашей системе.
Таким простым решением является добавление в вашу конфигурацию маршрутизации URL (при запуске веб-приложения) правила игнорирования для вашего URL:
routes.IgnoreRoute("community/qa/{*pathInfo}");
Комментарии:
1. Спасибо! Порядок перезаписи URL помогает!