2016-04-19 4 views
2

У меня есть следующее правило перезаписи в web.config моего ASP.NET MVC 5 проекта:«не-WWW на WWW» и «HTTPS» переписать правила в web.config, но не локальный ASP.NET MVC

<rule name="Redirect example.com to www.example.com and enforce https" enabled="true" stopProcessing="true"> 
    <match url="(.*)" /> 
    <conditions logicalGrouping="MatchAny"> 
     <add input="{HTTP_HOST}" pattern="^[^www]" /> 
     <add input="{HTTPS}" pattern="off" /> 
    </conditions> 
    <action type="Redirect" url="https://www.example.com/{R:1}" appendQueryString="true" redirectType="Permanent" /> 
</rule> 

Правило перенаправляет не-www на www и http на https (так что-то вроде http://example.com/hey будет перенаправлено на https://www.example.com/hey) и отлично работает. Однако он работает и с localhost, и я не могу его обойти - я пробовал правила отрицания и регулярные выражения, содержащие |, но, похоже, не может найти правильные комбинации. Я подхожу к этому неправильно?

ответ

3

В блоке conditions вы можете использовать атрибут negate="true". Если этот атрибут установлен и условие согласовано, тогда правило перезаписи не применяется.

Описание negate атрибута из IIS.net:

Шаблон может быть сведены на нет с помощью атрибута свести на нет из элемента. Когда этот атрибут используется, действие правила выполняется , только если текущий URL-адрес не соответствует указанному шаблону.

Поскольку вы используете MatchAny, добавление дополнительного атрибута не будет соответствовать, поскольку по крайней мере одно из условий будет выполнено в любом случае. Я рекомендую использовать 2 специфических правил перезаписи с logicalGrouping="MatchAll", где каждый из них отвечает только за один случай:

<rule name="enforce https" enabled="true" stopProcessing="true"> 
    <match url="(.*)" /> 
    <conditions logicalGrouping="MatchAll"> 
     <add input="{HTTPS}" pattern="off" /> 
     <add input="{HTTP_HOST}" matchType="Pattern" 
       pattern="^localhost(:\d+)?$" negate="true" /> 
    </conditions> 
    <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" 
      appendQueryString="true" redirectType="Permanent" /> 
</rule> 
<rule name="Redirect example.com to www.example.com" 
     enabled="true" stopProcessing="true"> 
    <match url="(.*)" /> 
    <conditions logicalGrouping="MatchAll"> 
     <add input="{HTTP_HOST}" pattern="^[^www]" /> 
     <add input="{HTTP_HOST}" matchType="Pattern" 
       pattern="^localhost(:\d+)?$" negate="true" /> 
    </conditions> 
    <action type="Redirect" url="https://www.example.com/{R:1}" 
     appendQueryString="true" redirectType="Permanent" /> 
</rule>  
+0

Спасибо, я получаю это в Chrome на живом сайте: «www.example.com перенаправлены вы слишком много раз. «ERR_TOO_MANY_REDIRECTS'» - то же самое в Firefox – globetrotter

+0

@globetrotter Я думаю, что это была проблема с 'MatchAny' - см., если обновленный ответ с' MatchAll' помогает – dotnetom

+0

теперь он работает для живого сайта, но пытается добавить 'https' на' localhost ' – globetrotter

Смежные вопросы