Невозможно переписать URL, включая компоненты строки запроса - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь переписать URL-адрес в asp.net core 2.2, но, похоже, он не работает с частью строки запроса. Я хочу изменить любой путь, например "finditem? Txn = 3", на что-то вроде "find / item? Transactionsid = 3". В качестве более простого примера, без умной замены идентификатора транзакции, посмотрите на этот код:

private static RewriteOptions GetRewriteOptions() => new RewriteOptions()
    .AddRewrite(@"^bananatxn=\d$", "Download", true) // Works with bananatxn=1
    .AddRewrite(@"^banana\?txn=\d$", "Download", true); // Does NOT work with banana?txn=1

Почему переписчик не может сопоставить знак вопроса? Я проверил свои паттерны в http://regexstorm.net/tester и, хотя паттерн кажется правильным, он не работает. Может ли программа переписывания в ядре asp.net переписать весь URL-адрес, включая строку запроса, или только часть перед знаком вопроса?

1 Ответ

0 голосов
/ 10 января 2019

Я исследовал и думаю (но не уверен), что эта функциональность недоступна во встроенных правилах, предоставляемых ядром asp.net. Это сработало для меня. Определенно НЕ проверено полностью, вероятно, придает слишком большое значение прописным и строчным буквам, и я не очень знаком со всеми компонентами и форматами URL.

public class RewritePathAndQuery : IRule
{
    private Regex _regex;
    private readonly string _replacement;
    private readonly RuleResult _resultIfRewrite;

    /// <param name="regex">Pattern for the path and query, excluding the initial forward slash.</param>
    public RewritePathAndQuery(string regex, string replacement, bool skipRemainingRules)
    {
        _regex = new Regex(regex);
        _replacement = replacement;
        _resultIfRewrite = skipRemainingRules ? RuleResult.SkipRemainingRules : RuleResult.ContinueRules;
    }

    public void ApplyRule(RewriteContext context)
    {
        HttpRequest request = context.HttpContext.Request;
        string pathExcludingInitialForwardSlash = request.Path.Value.Substring(1);
        string queryStringWithLeadingQuestionCharacter = request.QueryString.Value;
        string original = $"{pathExcludingInitialForwardSlash}{queryStringWithLeadingQuestionCharacter}";
        string replaced = _regex.Replace(original, _replacement);
        if (replaced.StartsWith('/')) { // Replacement pattern may include this character
            replaced = replaced.Substring(1);
        }
        if (original != replaced) { // Case comparison?
            string[] parts = replaced.Split('?');
            request.Path = $"/{parts[0]}";
            request.QueryString = new QueryString(parts.Length == 2 ? $"?{parts[1]}" : "");
            context.Result = _resultIfRewrite;
        }
        else {
            context.Result = RuleResult.ContinueRules;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...