IIS 7上的条件性https重定向

3

我在网站上设置了以下规则,将http重定向到https。但我们刚刚发现,我们的应用程序只提交了一个http api。在我们能够更新之前,我需要让网站忽略对/api文件夹的调用,并只重定向其他所有内容。我相信有一种方法可以说如果URL不包含/api/,则重定向。

<rewrite>
  <rules>
    <rule name="HTTP to HTTPS redirect" stopProcessing="true">
      <match url="(.*)" />
      <conditions>
        <add input="{HTTPS}" pattern="off" ignoreCase="true" />
      </conditions>
      <action type="Redirect" redirectType="Found" url="https://{HTTP_HOST}/{R:1}" />
    </rule>
  </rules>
</rewrite>
2个回答

2

添加类似于<add input="{R:0}" pattern="/api(/|$)(.*)" negate="true" />的条目,以便整个文件为:

<rewrite>
  <rules>
    <rule name="HTTP to HTTPS redirect" stopProcessing="true">
      <match url="(.*)" />
      <conditions>
        <add input="{R:0}" pattern="/api(/|$)(.*)" negate="true" />
        <add input="{HTTPS}" pattern="off" ignoreCase="true" />
      </conditions>
      <action type="Redirect" redirectType="Found" url="https://{HTTP_HOST}/{R:1}" />
    </rule>
  </rules>
</rewrite>

示例网址:http://site.com/api/function

因此,如果站点后面的URL与以下任何一个匹配,则会停止处理(因此不会将用户推送到https):

  • /api
  • /api/anything
  • 任何https URL

我们在反向代理后运行的IIS中运行大型应用程序时遇到了同样的问题。 IIS的URL重写插件(您似乎正在使用)有点麻烦,但它确实非常好地完成了工作并且可以容忍MVC框架。

正如您所提到的,仅在API目录中放置重写块是行不通的,因为在MVC中没有目录。 你会认为微软会有更好的解决方案-但他们没有。 这使得事情变得更具挑战性。


1

那个方法可以行得通,但是这是一个MVC应用程序,所以从技术上讲没有API目录。 - Jhorra
我明白了!作为一个快速解决方案,您可以在“匹配URL”字段中使用正则表达式,并编写一个特定于API的规则。 - Richard A.
这正是我所想的,只是我不知道如何编写正则表达式部分。 - Jhorra
但我希望有人能提供一个更为优雅、长期的MVC解决方案;) - Richard A.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接