Переписывающий URL с двумя вопросительными знаками в Rewriter в Config
Я не могу использовать дружественные URL на моем сайте DotNetNuke, и модуль, который я хочу использовать, требует этого. Проблема заключается в том, что, когда они отправляют сообщения во 2-ю часть процесса модуля, они добавляют "? Ctlname=Step2", а затем "? Ctlname=Step3" для следующего шага. Так...
URL заканчивается примерно так:
default.aspx? tab = 123 *?* Ctlname = Step2
Я пытаюсь решить эту проблему, переписав URL. Кажется, это должно работать, но это не так.
<RewriterRule>
<LookFor>.*/Default.aspx\?tabid=123(\?ctlname=.*)$</LookFor>
<SendTo>~/Default.aspx?tabid=123&ctlname=$1</SendTo>
</RewriterRule>
Любая помощь будет оценена!
2 ответа
Прошло некоторое время с тех пор, как я использовал его, но Snapsis Pageblaster может помочь. Он по сути кеширует, оптимизирует вашу производительность, но у него есть еще одна классная функция, которая может искать / заменять контент перед его отправкой в браузер клиента. Таким образом, вы можете переписать правила с ним и, возможно, сможете очистить эти URL, если не можете получить исходный код.
Если они используют? оценки для всех параметров URL, то я представляю, что исходный код будет ужасающим.;)
Вы не можете обработать переписанный URL-адрес с правилами переписывания siteUrls.config.
Это связано с тем, что строка запроса удаляется из пути перед его передачей в механизм правил, который обрабатывает каждый шаблон регулярных выражений.
В UrlRewriteModule.cs вы найдете код, который выглядит следующим образом:
string strQueryString = "";
if ((!String.IsNullOrEmpty(app.Request.Url.Query)))
{
strQueryString = request.QueryString.ToString();
requestedPath = requestedPath.Replace(app.Request.Url.Query, "");
}
Затем, далее вниз по странице, вы найдете это:
//check for the existence of the LookFor value
string pattern = "^" + RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath, rules[ruleIndex].LookFor) + "$";
Match objMatch = Regex.Match(requestedPath, pattern, RegexOptions.IgnoreCase);
Таким образом, вы можете поиграть с регулярным выражением, которое вы разместили, пока вы не коснетесь глазом, но это никогда не сработает. Это потому, что шаблон регулярных выражений оценивается по requestedPath
значение, в котором уже есть строка запроса.
Вам понадобится решение для перезаписи, которое происходит вверх по течению от DNN Url Rewriter, или настроенная версия Url Rewriter (которую я не рекомендую). Что-то вроде переписывания URL-адреса IIS7, которое обрабатывает URL-адрес еще до того, как DNN его увидит.
Но это также хорошее время, чтобы показать, кто контролирует код, чтобы прекратить использование недопустимых символов Url, если это вообще возможно.