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=]+)&([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=]+)&([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 以外的所有前缀
关于 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=]+)&([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=]+)&([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 以外的所有前缀