url с несколькими косыми чертами сразу после домена / порта вызывает 404, в asp.net ядро v5.0

#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. Более подробную информацию вы можете найти в моем ответе на обновление.