Web Config [=10th=] 在 IIS 中重写
WebConfig URL Rewrites in IIS
有一个 ASP.NET 解决方案并希望实现两件事:-
- 将 www.mydomain.com 重定向到 mydomain.com
- 有友善URL
所以...这是我添加的 webconfig 的 system.webserver 部分...
<rewrite>
<rules>
<rule name="Remove WWW prefix" >
<match url="(.*)" ignoreCase="true" />
<conditions trackAllCaptures="false">
<add input="{HTTP_HOST}" pattern="^www\.mydomain\.com" />
</conditions>
<action type="Redirect" url="{MapProtocol:{HTTPS}}://mydomain.com/{R:1}" redirectType="Permanent" />
</rule>
<rule name="homepage" stopProcessing="true" >
<match url="^/wwwzone/homepage.aspx$"/>
<action type="Redirect" url="/"/>
</rule>
<rule name="homepageReal" stopProcessing="true" >
<match url="^/$"/>
<action type="Rewrite" url="/somepath/homepage.aspx"/>
</rule>
</rules>
<rewriteMaps>
<rewriteMap name="MapProtocol">
<add key="on" value="https"/>
<add key="off" value="http"/>
</rewriteMap>
</rewriteMaps>
</rewrite>
这失败了。这背后的逻辑是:-
- 第一条规则负责将 www.mydomain.com 重定向到 mydomain.com。这行得通。并且使用 rewriteMap 它也可以正确处理 HTTP/HTTPS。
- 如果他们请求不友好的(真实的)URL.
,第二条规则应该进行浏览器重定向
- 最后一个旨在将友好的 URL 转换回真实的 URL,但是这是重写而不是重定向。
非常感谢任何想法。
原来我的正则表达式语法很差。
所以,匹配首页的真实URL应该是
<match url="^$"/>
不是
<match url="^/$"/>
而后续规则重写为真实URL应该以同样的方式改变。
因此,为了完整起见,这个有效...
<rewrite>
<rules>
<rule name="Remove WWW prefix" >
<match url="(.*)" ignoreCase="true" />
<conditions trackAllCaptures="false">
<add input="{HTTP_HOST}" pattern="^www\.mydomain\.com" />
</conditions>
<action type="Redirect" url="{MapProtocol:{HTTPS}}://mydomain.com/{R:1}" redirectType="Permanent" />
</rule>
<rule name="homepage" stopProcessing="true" >
<match url="^wwwzone/homepage.aspx"/>
<action type="Redirect" url="/"/>
</rule>
<rule name="homepageReal" stopProcessing="true" >
<match url="^$"/>
<action type="Rewrite" url="/somepath/homepage.aspx"/>
</rule>
</rules>
<rewriteMaps>
<rewriteMap name="MapProtocol">
<add key="on" value="https"/>
<add key="off" value="http"/>
</rewriteMap>
</rewriteMaps>
</rewrite>
有一个 ASP.NET 解决方案并希望实现两件事:-
- 将 www.mydomain.com 重定向到 mydomain.com
- 有友善URL
所以...这是我添加的 webconfig 的 system.webserver 部分...
<rewrite>
<rules>
<rule name="Remove WWW prefix" >
<match url="(.*)" ignoreCase="true" />
<conditions trackAllCaptures="false">
<add input="{HTTP_HOST}" pattern="^www\.mydomain\.com" />
</conditions>
<action type="Redirect" url="{MapProtocol:{HTTPS}}://mydomain.com/{R:1}" redirectType="Permanent" />
</rule>
<rule name="homepage" stopProcessing="true" >
<match url="^/wwwzone/homepage.aspx$"/>
<action type="Redirect" url="/"/>
</rule>
<rule name="homepageReal" stopProcessing="true" >
<match url="^/$"/>
<action type="Rewrite" url="/somepath/homepage.aspx"/>
</rule>
</rules>
<rewriteMaps>
<rewriteMap name="MapProtocol">
<add key="on" value="https"/>
<add key="off" value="http"/>
</rewriteMap>
</rewriteMaps>
</rewrite>
这失败了。这背后的逻辑是:-
- 第一条规则负责将 www.mydomain.com 重定向到 mydomain.com。这行得通。并且使用 rewriteMap 它也可以正确处理 HTTP/HTTPS。
- 如果他们请求不友好的(真实的)URL. ,第二条规则应该进行浏览器重定向
- 最后一个旨在将友好的 URL 转换回真实的 URL,但是这是重写而不是重定向。
非常感谢任何想法。
原来我的正则表达式语法很差。
所以,匹配首页的真实URL应该是
<match url="^$"/>
不是
<match url="^/$"/>
而后续规则重写为真实URL应该以同样的方式改变。
因此,为了完整起见,这个有效...
<rewrite>
<rules>
<rule name="Remove WWW prefix" >
<match url="(.*)" ignoreCase="true" />
<conditions trackAllCaptures="false">
<add input="{HTTP_HOST}" pattern="^www\.mydomain\.com" />
</conditions>
<action type="Redirect" url="{MapProtocol:{HTTPS}}://mydomain.com/{R:1}" redirectType="Permanent" />
</rule>
<rule name="homepage" stopProcessing="true" >
<match url="^wwwzone/homepage.aspx"/>
<action type="Redirect" url="/"/>
</rule>
<rule name="homepageReal" stopProcessing="true" >
<match url="^$"/>
<action type="Rewrite" url="/somepath/homepage.aspx"/>
</rule>
</rules>
<rewriteMaps>
<rewriteMap name="MapProtocol">
<add key="on" value="https"/>
<add key="off" value="http"/>
</rewriteMap>
</rewriteMaps>
</rewrite>