Ошибка строки запроса с. Net Перезапись основного URL - PullRequest
0 голосов
/ 23 января 2020

Работа над приложением в ASP. NET Core У меня возникла проблема при попытке переписать один URL-адрес, например: https://localhost: 44318 / Подробности? Content = My-url-to-rewrite & id = 221 в https://localhost: 44318 / mypage

Код, который я использую в начале метода Configure () для Startup.cs, следующий:

app.UseRewriter(new RewriteOptions()
        .AddRewrite(@"^Details?content=My-url-to-rewrite&id=221", "/mypage", skipRemainingRules: true));

Странно то, что если я пытаюсь переписать URL-адрес без строки запроса, как показано ниже, он работает

app.UseRewriter(new RewriteOptions()
        .AddRewrite(@"^Details", "/mypage", skipRemainingRules: true));

И даже при добавлении знака вопроса для добавления строки запроса он работает, как следующий

app.UseRewriter(new RewriteOptions()
        .AddRewrite(@"^Details?", "/mypage", skipRemainingRules: true));

Но как только я добавляю хотя бы один символ после знака вопроса, URL-адрес не переписывается, и страница связывается как обычно без каких-либо ошибок.

Есть идеи?

Заранее спасибо.

1 Ответ

0 голосов
/ 24 января 2020

Вы можете реализовать свое собственное промежуточное ПО ReWrite:

Configure:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{   
    ....
    var options = new RewriteOptions()
                 .Add(RedirectMyRequests);

    app.UseRewriter(options);
    ...
}
static void RedirectMyRequests(RewriteContext context)
{
    var request = context.HttpContext.Request;
    // Because we're redirecting back to the same app, stop processing if the request has already been redirected
    //If the modified path is similar with previous, add if statemetn to stop processing

    //check the request path and request QueryString
    if (request.Path.Value.StartsWith("/Details", StringComparison.OrdinalIgnoreCase) && request.QueryString.Value.StartsWith("?content", StringComparison.OrdinalIgnoreCase))
    {
        if (request.QueryString.Value.Split('&')[1].StartsWith("id", StringComparison.OrdinalIgnoreCase))
        {
            var response = context.HttpContext.Response;
            response.StatusCode = StatusCodes.Status301MovedPermanently;
            context.Result = RuleResult.EndResponse;
            //change it with needed path, it is combined with request path and request QueryString
            response.Headers[HeaderNames.Location] = "/Home/Privacy";
        }

    }
}
...