#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)