Перезапись URL-адресов HttpModule с использованием IIS6 без URL-адресов без расширения

Мы используем модуль Intelligencia URLRewriting для asp.net с версией 2.0 платформы и IIS6. Наши URL-адреса обычно не имеют расширения.

Я понимаю, что IIS6 не может справиться с этой ситуацией без общего подстановочного знака (который вызывает другие проблемы).

Однако это работает! Иногда. В других случаях (например, на одной машине разработчика и на моей машине, когда я указываю другой виртуальный каталог в приложении), это не так. Под «это не работает» я имею в виду, что настроенные модули HttpModules никогда не попадают.

Кто-нибудь может это объяснить?

Спасибо.


person Gaz    schedule 12.02.2009    source источник


Ответы (4)


Получается, что происходило следующее:

  • запрос поступает на (скажем) http://website/products/productid
  • IIS не может найти это, поэтому мы получаем 404
  • случайно у нас есть настраиваемая страница ошибок, настроенная в IIS для 404-х
  • эта страница с ошибкой вставляет ссылающийся URL в конец страницы 404 error.aspx
  • поэтому мы получаем перенаправление на asp.net в следующих строках:

    http://website/error.aspx?404;http://website/products/productid

  • наши регулярные выражения для перезаписи URL теперь были настроены таким образом, что они отбрасывали бит error.aspx и обрабатывали http://website/products/productid, как если бы это был реальный URL

  • поэтому asp.net отображает http://website/product.aspx?id=productid по запросу. !

Я предполагаю, что это может оказаться полезным для кого-то, но мы переходим к фильтру isapi. Следует отметить, что по умолчанию это приведет к замкнутому циклу перенаправлений!

person Gaz    schedule 12.02.2009

Если вы запускаете сайт с помощью веб-сервера разработки Visual Studio, все запросы будут обрабатываться asp.net, поэтому ваш HttpModule будет работать.

В IIS6 этого не должно происходить, если он не настроен для пересылки запросов на asp.net.

person Rune Grimstad    schedule 12.02.2009
comment
Мы используем IIS6 во всех случаях. - person Gaz; 12.02.2009

Вы уверены, что когда "это работает", вы не работаете под веб-сервером разработки Cassini, включенным в VS.NET? Потому что подстановочные знаки без расширений действительно работают в Cassini, что, мягко говоря, может сбивать с толку.

person andynormancx    schedule 12.02.2009
comment
Ага. Разработчики не используют Cassini. Он работает на различных тестовых серверах, которые развертываются так же, как и наш действующий веб-сайт. Из-за этой загадки черной магии мы, вероятно, собираемся вместо этого переключиться на фильтр ISAPI, но мне было бы интересно узнать, что на самом деле происходит. - person Gaz; 12.02.2009
comment
Я должен был увидеть ваш другой ответ. Думаю, я просто слишком хотел писать о возможности Кассини. Переход с Cassini на IIS6 и обнаружение, что это не работает, был одним из моих самых больших моментов в жизни. - person andynormancx; 12.02.2009

Если вы используете IIS6 с ASP.net 4.0, вы должны указать и зарегистрировать такие модули:

<system.web>
<httpModules>
      <add name="UrlRewriter" type="Intelligencia.UrlRewriter.RewriterHttpModule, Intelligencia.UrlRewriter"/>

not

<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
      <add name="UrlRewriter" type="Intelligencia.UrlRewriter.RewriterHttpModule, Intelligencia.UrlRewriter"/>
</modules>

person cqin    schedule 11.12.2011