Сам очень хотел в этом разобраться, так что повеселился, пытаясь заставить что-то работать К сожалению, у меня возникли некоторые проблемы с использованием .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:)