Как использовать {PATH_INFO} в модуле перезаписи ядра ASP. NET? - PullRequest
1 голос
/ 11 июля 2020

Я пытаюсь переместить следующее правило перезаписи IIS в ASP. NET Запуск Core 3.1. Однако, когда я это делаю, я получаю «System.FormatException:» Нераспознанный тип параметра: «PATH_INFO», завершается строковым индексом: исключение «10». Согласно Gitub issue , PATH_INFO не поддерживается еще. Есть ли способ заставить это работать без PATH_INFO? Правило перезаписи IIS:

    <rewrite>
      <rules>
        <rule name="CamelCaseFormatRule" stopProcessing="true">
      <match url=".*" ignoreCase="true" />
      <action type="Redirect" url="/InstructionManual/{R:0}" logRewrittenUrl="true" />
      <conditions>
        <add input="{HTTP_HOST}" pattern="^localhost$" />
        <add input="{PATH_INFO}" pattern="InstructionManual" ignoreCase="false" negate="true" />
      </conditions>
    </rule>
  </rules>
</rewrite>

Я поместил это в файл XML в root своего приложения и вызвал его в Startup например:

app.UseRewriter (new RewriteOptions (). AddIISUrlRewrite (env.ContentRootFileProvider, "redirectRule.config"));

Это правило проверяет, есть ли в запросе виртуальный каталог ящика верблюда имя (например, InstructionManual). Если нет, восстановите URL-адрес в правильный формат и выполните перенаправление.

Это правило работает нормально, когда я использую модуль IIS. Вот несколько примеров:

http://localhost/InstructionManual/?id=54 --> http://localhost/InstructionManual/?id=54
http://localhost/instructionmanual/?id=54 --> http://localhost/InstructionManual/?id=54
http://localhost/insTructionManuaL/?id=54 --> http://localhost/InstructionManual/?id=54

1 Ответ

0 голосов
/ 11 июля 2020

похоже, что я решил свой вопрос. Я следил за решением здесь: Redirect Non WWW to WWW using Asp. Net Core Middleware

на основании этого я изменил свое собственное правило на :

public virtual void ApplyRule(RewriteContext context)
{
  var req = context.HttpContext.Request;

  var p = req.Path;
  string pathBase = req.PathBase;
  var h = req.Host;

  if (pathBase.Equals("/InstructionManual"))
  {
    context.Result = RuleResult.ContinueRules;
    return;
  } 

  var wwwHost = new HostString($"{req.Host.Value}");
  var newUrl = UriHelper.BuildAbsolute(req.Scheme, wwwHost, "/InstructionManual", req.Path, req.QueryString);
  var response = context.HttpContext.Response;
  response.StatusCode = 301;
  response.Headers[HeaderNames.Location] = newUrl;
  context.Result = RuleResult.EndResponse;
}
...