Получить исходный URL-адрес перед перенаправлением IIS

#c# #asp.net-core #iis

#c# #asp.net-core #iis

Вопрос:

В настоящее время мы перенаправляем URL-адреса с помощью IIS. Но для отображения канонических URL-адресов на сайте для SEO нам нужен исходный URL-адрес.

Пример: фактический URL: www.example.com/topsellers/mobiles Перенаправленный URL-адрес: www.example.com/products?type=mobiles

Правила перезаписи IIS:

 <rule name="url1" stopProcessing="true">
            <match url="topsellers/([a-zA-Z0-9] )" />
            <action type="Rewrite" url="products?type={R:1}" />
        </rule>
 

Есть ли в C # способ получить фактический URL-адрес в контроллере?

Я попытался использовать HttpContext.Current.Запрос, HttpRequest и многие другие объекты из C #, но не смог получить доступ к требуемому. Может ли кто-нибудь помочь мне с этим, если есть какое-либо решение?

Используемый технологический стек: ASP NET CORE V2.2.1

Комментарии:

1. Как сказал СоуСин, существует последовательность обработки перенаправления URL-адреса iis и контроллера, можете ли вы рассказать мне о своей цели для этого? Возможно, это может быть достигнуто другим способом.

Ответ №1:

Вы не найдете его в контроллере, поскольку правила обрабатываются начиная с уровня сервера и вплоть до сайта и вложенных папок. Сама перезапись URL-адреса обрабатывается очень рано в конвейере IIS, перед большинством функций, связанных с IIS.

Но вы можете попробовать проверить два события: PreBeginRequest для глобальных правил и BeginRequest в вашем конкретном случае. HttpRequest объект в этих событиях должен содержать начальный URL.

Для получения дополнительной информации: перезапись URL-адреса IIS и ASP.NET Маршрутизация

Ответ №2:

Вместо использования правил перезаписи IIS, что вы хотите сделать, это реализовать пользовательский IHttpModule, который заботится о перезаписях (и удаляет наши правила перезаписи из web.config .

Вам нужно будет реализовать Init() метод для его настройки и подключить BeginRequest() , где у вас будет доступ к исходному запросу, и вы можете перенаправить его, переписать или иным образом обработать его по своему усмотрению. Или ничего не делать и передать его вместе.

После того, как вы его внедрили, вы просто подключаете его к стеку в web.config :

 <system.web>
  <httpModules>
    <add type="Nordstrom.Web.External.HttpsSupport.HttpsFilter, Nordstrom.Web.External" name="HttpsFilter" />
    <add type="Nordstrom.Web.External.InternationalShopModule, Nordstrom.Web.External" name="IntlShipModule" />
    <add type="Nordstrom.Web.External.RequestManager, Nordstrom.Web.External" name="RequestHandler" />
  </httpModules>
  . . .
</system.web>
 

Ответ №3:

 @using Microsoft.AspNetCore.Http.Features

@{var path = Context.Request.HttpContext.Features.Get<IHttpRequestFeature>().RawTarget.ToString();}
 

Вот как я смог получить фактический URL-адрес, который пользователь может видеть в адресной строке после перезаписи на другую страницу / URL. (Это записано в представлении Razor .cshtml)