Regex находит строку в URL, без учета регистра - PullRequest
1 голос
/ 24 февраля 2012

У меня есть URL:

http://primarydomain.com/sites/secondarydomain/?foo=bar

Какое выражение регулярного выражения можно использовать, чтобы соответствовать URL для sites/secondarydomain - без учета регистра (это правило для файла web.config, но требует стандартногоregex)?

Чтобы поместить это в контекст, я пишу правило перезаписи URL web.config для удаления sites/secondarydomain из всех URL-адресов (из-за того, что несколько сайтов размещаются в одном пакете).

<rule name="Remove full hosting path">
    <match url="***Regex goes here***" ignoreCase="true"/>
    <action type="Redirect" url="http://secondary.com/{R:1}" redirectType="Permanent" />
</rule>

Я ищу сопоставление только каталогов (не строки запроса), чтобы перенаправить пользователя (следовательно, удалить sites/secondarydomain).

Обновление: похоже, я хочу переписатьURL, а не перенаправление, вот текущее правило web.config, которое не совсем работает:

    <rule name="TestRule">
      <match url=".*" />
      <conditions>
        <add input="{PATH_INFO}" pattern="^(/hostedsites/clemones_htdocs)(/.*)"/>
      </conditions>
      <action type="Rewrite" url="\{C:2}" appendQueryString="true" />
    </rule>

Где мой вторичный домен http://clemones.com/ и путь, который я пытаюсь найтиизбавиться от: http://clemones.com/hostedsites/clemones_htdocs/

ДЛЯ тестирования, http://clemones.com/shizzle работает как пункт назначения (следовательно, к сожалению http://clemones.com/hostedsites/clemones_htdocs/shizzle также работает).

Заранее спасибо

Ответы [ 4 ]

1 голос
/ 24 февраля 2012

Вы пробовали:

Чтобы уточнить, это только применяет регулярное выражение к пути, а не корневой URL:

 <rule name="TestRule">
     <match url=".*" />
     <conditions>
         <add input="{PATH_INFO}" pattern="^(/sites/secondarydomain)(/.*)"/>
     </conditions>
     <action type="Rewrite" url="\{C:2}" appendQueryString="true" />
 </rule>

Есть несколько групп, вытекающих из условия, {C: 2} представляет все, что идет после "/ sites / primarydomain /", за исключением строки запроса, к которой добавляется выбор "appendQueryString = true".

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

Вот статья, которая объясняет, как это работает: http://weblogs.asp.net/owscott/archive/2010/01/26/iis-url-rewrite-hosting-multiple-domains-under-one-site.aspx

0 голосов
/ 25 февраля 2012

Комбинация lookbehind и lookahead будет соответствовать строке , которую вы хотите:

(?<=.\w+/)\w+/\w+(?=/.*)

При этом {R:1} в вашем примере действительно выглядит такRegex обратная ссылка , поэтому, возможно, именно поэтому все работает не так, как ожидалось.Если это правда, вам может понадобится что-то вроде этого:

.\w+/(\w+/\w+)

Никогда не выполнялась перезапись IIS, поэтому YMMV.Два регулярных выражения работают (проверены) на приведенных вами примерах, а также на более общих URL, таких как:

http://primarydomain.com/hostedsites/clemones_htdocs/index.aspx?foo=bar
http://anydomain.net/sites/secondarydomain/index.aspx?foo=bar
...
0 голосов
/ 24 февраля 2012

если домен всегда будет http://primarydomain.com/sites/, я бы атаковал его так:

match url = "http://primarydomain.com/sites/([A-Za-z0-9_]+)/.*";

0 голосов
/ 24 февраля 2012

Попробуйте заглянуть назад (?<=(http://primarydomain.com/))[^\b]*

РЕДАКТИРОВАТЬ:

Если вы хотите исключить строку запроса ... (?<=(http://primarydomain.com/))[^?]*

Если вы хотите быть более строгим дляпо какой-либо причине (например, разрешив вводить только буквы алфавита в каталоге), вы можете попробовать что-то вроде этого (?<=(http://primarydomain.com/))[a-zA-Z/]*[a-zA-Z]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...