#c# #asp.net #asp.net-core #http-status-code-404 #url-routing
#c# #asp.net #asp.net-ядро #http-status-code-404 #url-маршрутизация
Вопрос:
Вопрос:
В приложениях .Net Core v5.0:
- Как перехватить URL-адрес, такой как: «http://localhost:5000 //» или «http://localhost:5000 ///»??
- Есть ли способ перехватить такой URL с конфигурацией маршрута?
- Или, есть ли способ перехватить такой URL в IIS?
Эти URL-адреса в порядке (200, а не 404) в приложениях .NET Core v2.1.
Проблема:
http://localhost:5000 — //200 ОК
http://localhost:5000/ — //200 Хорошо
http://localhost:5000// — //404 (более 1 косой черты: причина 404)
http://localhost:5000/// — //404
Информация о консоли: (обратите внимание на двойные косые черты «//» после localhost: 5000)
info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
Request finished HTTP/1.1 GET http://localhost:5000// - - - 404 0 - 12.1067ms
В то время как URL-адрес с несколькими косыми чертами в середине пути URL (не сразу после домена / порта) может быть перехвачен и обработан.
Окружающая среда:
1.asp.net ядро v5.0
2.Конфигурация маршрута:
app.UseRouting();
app.UseMvc(routes => //attribute routing is always available
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
3.Program.cs
public static void Main(string[] args)
{
Console.Title = "WebApplication1";
var host = CreateHostBuilder(args).Build();
host.Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
4.web.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<location path="." inheritInChildApplications="false">
<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
</handlers>
<aspNetCore processPath="dotnet" arguments=".WebApplication1.dll" stdoutLogEnabled="false" stdoutLogFile=".logsstdout" hostingModel="inprocess" />
</system.webServer>
</location>
</configuration>
Комментарии:
1. Протестировано в .net core v2.1, v3.1, v5.0, » localhost: 5000 // » показывает обычную домашнюю индексную страницу в версии v2.1, в то время как в версиях v3.1 и v5.0 отображается 404.
Ответ №1:
Или, есть ли способ перехватить такой URL в IIS?
Вы могли бы использовать url rewrite в IIS, чтобы переписать \
в «».
Вы можете установить перезапись URL-адреса, используя это расширение.
Затем вы могли бы добавить правило перезаписи URL ниже:
<rewrite>
<rules>
<rule name="Remove multiple slashes" stopProcessing="true">
<match url=".*" />
<action type="Redirect" url="{REQUEST_URI}" />
<conditions>
<add input="{UNENCODED_URL}" pattern="(.*?)[/]{2,}$" />
</conditions>
</rule>
</rules>
</rewrite>
Результат:
Добавьте приведенные ниже коды в метод настройки:
var options = new RewriteOptions()
.AddRedirect(@"(.*?)[/]{2,}$", "/");
app.UseRewriter(options);
Результат:
Комментарии:
1. Это решает проблему в IIS для .net core v5.0. Мне было интересно, есть ли способ перехватить такой URL в коде? В .net core v2.1 такой URL-адрес не вызывает 404 без перезаписи URL-адреса.
2. обновление: измените шаблон
<add input="{UNENCODED_URL}" pattern="[/]{2,}" />
, чтобы перехватывать URL с несколькими косыми чертами в середине (а не только в конце).3. На мой взгляд, мы могли бы записать этот URL-адрес в кодах, мы могли бы использовать настраиваемое промежуточное программное обеспечение для отслеживания URL-адреса, если URL-адрес содержит /// , мы могли бы изменить его на / . Также asp.net ядро содержит встроенное промежуточное программное обеспечение для перезаписи URL, мы могли бы использовать его вместо использования правила перезаписи url. Более подробную информацию вы можете найти в моем ответе на обновление.