Переписывающий 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&amp;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, если это вообще возможно.

Другие вопросы по тегам