如何匹配除一个以外的所有组合?

时间:2017-08-25 23:55:57

标签: .net regex iis arr

我有一组执行此操作的ARR重定向/重写规则:

  1. 每当子域tfs位于网址
  2. 时,重定向到HTTPS
  3. 从网络上的其他服务器提取内容。
  4. 这是我的配置:

    <rule name="TFS Redirect" enabled="true" stopProcessing="true">
        <match url="^((?!tfs).)*$" />
        <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
            <add input="{HTTP_HOST}" pattern="tfs.domain.com" />
        </conditions>
        <action type="Redirect" url="https://tfs.domain.com/tfs" appendQueryString="false" />
    </rule>
    <rule name="TFS Rewrite" enabled="true" stopProcessing="true">
        <match url="^tfs(.*)" />
        <conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
        <action type="Rewrite" url="http://server3:8080/{R:0}" />
    </rule>
    

    问题是此设置与我的Let's Encrypt配置冲突。不知何故,我需要对除此URL之外的所有内容强制执行上述规则:

    http://tfs.domain.com/.well-known/acme-challenge/*

    这是驱动自动证书续订过程的传入远程质询的答案。但是,由于这些规则,ACME服务器无法访问本地IIS进行验证,并且证书未续订。

    如何在抓住其他所有内容时允许这一个网址通过?有没有办法为条件添加例外?或者我应该完全删除这个条件,并完全依赖RegEx表达式吗?

1 个答案:

答案 0 :(得分:0)

经过几个小时的RegEx fiddling,我想出了修复。

以下是新规则:

<rule name="TFS Redirect" enabled="true" stopProcessing="true">
    <match url="^(.*)" />
    <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
        <add input="{HTTPS}" pattern="^OFF$" />
        <add input="{HTTP_HOST}" pattern="^tfs\.domain\.com$" />
        <add input="{URL}" pattern="^/\.well-known*" negate="true" />
    </conditions>
    <action type="Redirect" url="https://tfs.domain.com/tfs" appendQueryString="false" redirectType="Found" />
</rule>

我不想承认我不知道我早先的表达方式在哪里,但它是关闭的。我所要做的就是把它退回来,调整一下条件,一切都顺利通过。

此规则捕获并重定向这些请求:

  1. 针对tfs.domain.com
  2. 的所有请求的非HTTPS网址
  3. 以上所有除了那些不以/.well-known服务器变量中的{URL}开头的
  4. 仅供参考我在找到this后选择了302重定向。