IIS 重写非常混乱

IIS Rewrite very confusing

关于 IIS 重写。

我想在我的本地 IIS 实例上更改此 url

http:///localhost/MySite/health?key=BczI5MyulpRLxI2kiJmIXwLOm78r3qr8z2gwcsYTGR4=&c

重定向到此 url:

http:///localhost/MySite/Health.svc/BczI5MyulpRLxI2kiJmIXwLOm78r3qr8z2gwcsYTGR4=/c

如您所见,我不希望传入请求使用

Health.svc/BczI5MyulpRLxI2kiJmIXwLOm78r3qr8z2gwcsYTGR4=/c

而不是使用

health?key=BczI5MyulpRLxI2kiJmIXwLOm78r3qr8z2gwcsYTGR4=&c

Health.svc 是 WCF 端点名称,所以我只需要 /health 末尾有键和过滤器参数,如图所示。

无论我在我的网络配置中重写什么,它仍然不起作用。我很困惑要放入 url 的哪一部分,因为正则表达式似乎是有效的,因为我可以在 IIS 和在线正则表达式验证器中对其进行测试。

<rewrite>
  <rules>
    <rule name="HealthRewrite" stopProcessing="true" enabled="true">
      <match url="MySite\/health\?key=([0-9a-zA-Z=]+)&amp;([a-z])" />
      <action type="Rewrite" url="MySite/Health.svc/{R:1}/{R:2}" appendQueryString="false" />
    </rule>
  </rules>
</rewrite>

我怎样才能让它工作?我已经安装了重写模块,可以在 IIS 中看到它,也可以看到 dll 已注册。

我设法让它可以访问各种网站,因为它根本不明显。

他们似乎把条件放进去,然后是一个带有正则表达式的 {QUERY_STRING} ,然后可以创建 {C:1} 和 {C:2} 组,这些组被推入新的重写

<rewrite>
  <rules>
    <rule name="HealthRewrite" stopProcessing="true" enabled="true">
      <match url="^health" />
      <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
        <add input="{QUERY_STRING}" pattern="key=([0-9a-zA-Z=]+)&amp;([a-z])" />
      </conditions>
      <action type="Rewrite" url="/MySite/Health.svc/{C:1}/{C:2}" appendQueryString="false"/>
    </rule>
  </rules>
</rewrite>

我发现知道要匹配什么 url 很困惑,但是通过一些简单的 ^health 测试,我可以更容易地看到并尝试获取查询字符串参数。我必须为重写提供 /MySite/ 前缀,这很混乱,因为匹配不需要那个!

如果要在IIS中匹配查询字符串的值,需要使用{QUERY_STRING}。这是一个演示:

      <rewrite>
            <rules>
                <rule name="Test">
                    <match url="(Service1)" />
                    <conditions>
                        <add input="{QUERY_STRING}" pattern="(key)=(.*)" />
                    </conditions>
                    <action type="Rewrite" url="Service1.svc/{C:2}" />
                </rule>
            </rules>
        </rewrite>

这是我的web.config。

这个URL:

http:///localhost/Service1?key=getdata

将重定向到此 url:

http:///localhost/Service1.svc/GetData

关于你的最后一个问题,为什么要添加 MySite 前缀?这是因为 Rewrite URL 中的 URL 将用作重定向 URL。请注意,它使用反向引用来保留和重新排列在模式匹配期间捕获的原始 URL 片段。对于 Rewrite,必须在 Rewrite URL.

中提供除 localhost 以外的所有前缀