. NET Core URL Rewrite для перехода с веб-форм на. NET Core - PullRequest
0 голосов
/ 24 апреля 2020

Я потратил часы, чтобы найти правильный синтаксис для замены URL моего старого веб-сайта на мой новый. NET Версия Core3.0, потому что Google проиндексировал тысячи страниц со старыми URL.

Я хочу использовать промежуточное программное обеспечение перезаписи URL, чтобы сделать это для меня:

старый URL:

www.domain.com/details.aspx?u1=pagename

новый URL:

www.domain.com/pagename

, а также

старый URL: www.domain.com/details.aspx?u1=pagename&u2=mode

новый URL:

www.domain.com/pagename/mode

Код, который я пробовал:

var rewriteOptions = new RewriteOptions()
                .AddRedirect("^.*(?:details.aspx).*$", "/{C:1}{C:2}", 301);

Я знаю, что это неправильно, поэтому кто-нибудь может мне помочь, как использовать Правила? Спасибо.

1 Ответ

1 голос
/ 24 апреля 2020

Сам очень хотел в этом разобраться, так что повеселился, пытаясь заставить что-то работать К сожалению, у меня возникли некоторые проблемы с использованием .AddRedirect, чтобы также сопоставить строку запроса.

Поэтому я нашел следующее решение, надеюсь, это поможет вам:

var rewriteOptions = new RewriteOptions()
            .Add(new RuleForU1AndU2())
            .Add(new RuleForU1());

И затем наличие 2 правил :

public class RuleForU1 : IRule
{
    private int StatusCode { get; } = (int)System.Net.HttpStatusCode.MovedPermanently;

    public void ApplyRule(RewriteContext context)
    {
        var request = context.HttpContext.Request;
        var url = request.Path.Value;
        var queryString = request.QueryString.Value;

        if (!url.Equals("/details.aspx", StringComparison.OrdinalIgnoreCase) || queryString.Length == 0)
        {
            context.Result = RuleResult.ContinueRules;
            return;
        }

        var regexMatches = Regex.Matches(queryString, @"^?u1=(.*)");
        if(regexMatches.Count == 0)
        {
            context.Result = RuleResult.ContinueRules;
            return;
        }

        string newUrl = regexMatches[0].Groups[1].Value;

        var response = context.HttpContext.Response;
        response.StatusCode = StatusCode;
        response.Headers[Microsoft.Net.Http.Headers.HeaderNames.Location] = newUrl;
        context.Result = RuleResult.EndResponse;
        return;
    }
}

public class RuleForU1AndU2 : IRule
{
    private int StatusCode { get; } = (int)System.Net.HttpStatusCode.MovedPermanently;

    public void ApplyRule(RewriteContext context)
    {
        var request = context.HttpContext.Request;
        var url = request.Path.Value;
        var queryString = request.QueryString.Value;

        if (!url.Equals("/details.aspx", StringComparison.OrdinalIgnoreCase) || queryString.Length == 0)
        {
            context.Result = RuleResult.ContinueRules;
            return;
        }

        var regexMatches = Regex.Matches(queryString, @"^?u1=(.*)&u2=(.*)");
        if (regexMatches.Count == 0)
        {
            context.Result = RuleResult.ContinueRules;
            return;
        }

        string newUrl = $"{regexMatches[0].Groups[1].Value}/{regexMatches[0].Groups[2]}";

        var response = context.HttpContext.Response;
        response.StatusCode = StatusCode;
        response.Headers[Microsoft.Net.Http.Headers.HeaderNames.Location] = newUrl;
        context.Result = RuleResult.EndResponse;
        return;
    }
}

Я действительно не прикладывал усилий к повторному использованию кода ... и вы, вероятно, можете объединить 2 правила в одно правило, но я не знаю, каков ваш полный вариант использования (например, будет там тоже будет u3?) Итак ... Надеюсь, это поможет вам приблизиться к месту, где вам нужно go:)

...