2016-02-26 2 views
1

Я тщательно изучил этот пункт и, по-моему, делаю правильные вещи. Однако это не работает, поэтому мое мнение должно быть неправильным!Правила перезаписи IIS не работают должным образом

У меня есть сайт, на котором все содержимое находится в wwwroot или других папках. Я пытаюсь заставить URL HTML5 работать. На веб-сайте представлено 5 типов URL.

  1. Пустой URL.
  2. URL, предназначенный для физического файла, например, CSS, HTML или JS подать
  3. URL-адрес/API/... для доступа к ресурсам
  4. A URL/OAuth/маркер для аутентификации
  5. формат HTML5 тип URL, например/ABOUTUS

у меня есть следующие правила перезаписи в web.config

<rule name="index.html as document root" stopProcessing="true"> 
     <match url="^$" /> 
     <action type="Rewrite" url="/wwwroot/index.html" /> 
    </rule> 
    <rule name="static dist files" stopProcessing="true"> 
     <match url="^(.+)$" /> 
     <conditions> 
     <add input="{APPL_PHYSICAL_PATH}wwwroot\{R:1}" matchType="IsFile" /> 
     </conditions> 
     <action type="Rewrite" url="/wwwroot/{R:1}" /> 
    </rule> 
    <rule name="api call" stopProcessing="true"> 
     <match url="^/api/" /> 
     <action type="None"/> 
    </rule> 
    <rule name="authorization call" stopProcessing="true"> 
     <match url="^/oauth/token$" /> 
     <action type="None"/> 
    </rule> 
    <rule name="reroute html5 to index.html" stopProcessing="true"> 
     <match url="^.+$" /> 
     <action type="Rewrite" url="/wwwroot/index.html" /> 
    </rule> 

Я не могу понять, что я делаю неправильно. Документация, которую я могу найти для «stopProcessing», неточна, но я предполагаю, что это означает, что если это правило согласовано, не обрабатывайте больше правил.

Что происходит, так это то, что обращения к API или для проверки подлинности не обрабатываются правильно - отладка API не вызывается и вместо этого она переписывается в wwwroot/index.html.

Уверен, что я делаю что-то очень простое, но я пробовал все, что я могу думать об этом, имеет смысл.

Любая помощь приветствуется.

Сервер использует OWIN с JWT, а фронтент - AngularJS. Я использую сообщество VS2015 для разработки.

ответ

0
<defaultDocument> 
    <files> 
    <clear /> 
    <!-- This is the root document for the Angular app --> 
    <add value="wwwroot/index.html" /> 
    </files> 
</defaultDocument> 

<rewrite> 
    <rules> 

    <rule name="static dist files" stopProcessing="true"> 
     <match url="^(.+)$" /> 
     <conditions> 
     <add input="{APPL_PHYSICAL_PATH}wwwroot\{R:1}" matchType="IsFile" /> 
     </conditions> 
     <action type="Rewrite" url="/wwwroot/{R:1}" /> 
    </rule> 

    <rule name="Main Rule" stopProcessing="true"> 
     <match url=".*" /> 
     <conditions logicalGrouping="MatchAll"> 
     <!-- Allows "api/" prefixed URLs to still hit Web API controllers 
         as defined in WebApiConfig --> 
     <add input="{REQUEST_URI}" pattern="api/" ignoreCase="true" negate="true" /> 
     <!-- Allow "oauth/token" to do autnentication --> 
     <add input="{REQUEST_URI}" pattern="oauth/token" ignoreCase="true" negate="true"/> 
     </conditions> 
     <action type="Rewrite" url="/" /> 
    </rule> 

    </rules> 
</rewrite> 

После долгих проб и ошибок, я, наконец, получил его на работу, и теперь у меня он работает, все это очевидно.

Документ по умолчанию заботится о случае 1 в исходном вопросе. Правило «static dist files» обрабатывает случай 2. «Основное правило» позаботится о случае 5, убедившись в том, чтобы оставить случаи 3 и 4 нетронутыми.