在尝试帮助 iis.net 论坛上的一位开发人员后,我开始寻找一种更好的方式来进行重定向。因此,我结束了这篇文章。
我接受了很多这些想法并开始实现我自己的版本。一切似乎都很好,但我在路上遇到了一个颠簸,我希望你能提供帮助。
好的,快速解释一下我的规则:
我的想法是测试 url,如果我发现它有问题,我会重写 url 并让它继续,而不是立即重定向它。如果在任何时候我重写了 url,我将自定义服务器变量“重定向”设置为 true。然后最后,我测试我的自定义服务器变量是否为真并重定向用户。
它的重点是只有一个 301 重定向,而不是一系列重定向。
这些是我的规则(对不起墙):
<rules>
<rule name="WhiteList - resources" stopProcessing="true">
<match url="^resources/" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
<action type="None" />
</rule>
<rule name="Redirect subdomains with www to non-www" stopProcessing="false">
<match url="(.*)" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{HTTP_HOST}" pattern=".*localhost.*" negate="true" />
<add input="{HTTP_HOST}" pattern="^www\.(.*)\.([^\.]+)\.([^\.]+)$" />
</conditions>
<action type="Rewrite" url="http://{C:1}.{C:2}.{C:3}{HTTP_URL}" />
<serverVariables>
<set name="Redirect" value="true" />
</serverVariables>
</rule>
<rule name="Redirect top domains with non-www to www" stopProcessing="false">
<match url="(.*)" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{HTTP_HOST}" pattern=".*localhost.*" negate="true" />
<add input="{HTTP_HOST}" pattern="^([^\.]+)\.([^\.]+)$" />
</conditions>
<action type="Rewrite" url="http://www.{HTTP_HOST}{HTTP_URL}" />
<serverVariables>
<set name="Redirect" value="true" />
</serverVariables>
</rule>
<rule name="SEO - Remove trailing slash" stopProcessing="false">
<match url="(.*)/$" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="{R:1}" />
<serverVariables>
<set name="Redirect" value="true" />
</serverVariables>
</rule>
<rule name="SEO - ToLower" stopProcessing="false">
<match url="(.*)" ignoreCase="false" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{URL}" pattern="[A-Z]" ignoreCase="false" />
<add input="{URL}" pattern="^.*?\.(axd|css|js|jpg|jpeg|png|gif|ashx|asmx|svc).*?$" negate="true" />
<add input="{URL}" pattern="^.*/(webshop)/.*$" negate="true" />
</conditions>
<action type="Rewrite" url="{ToLower:{R:1}}" />
<serverVariables>
<set name="Redirect" value="true" />
</serverVariables>
</rule>
<rule name="SEO - remove default.aspx" stopProcessing="false">
<match url="(.*?)/?default\.aspx$" />
<action type="Rewrite" url="{R:1}" />
<serverVariables>
<set name="Redirect" value="true" />
</serverVariables>
</rule>
<rule name="SEO - Trim aspx" stopProcessing="false">
<match url="(.*)\.aspx$" />
<action type="Rewrite" url="{R:1}" />
<serverVariables>
<set name="Redirect" value="true" />
</serverVariables>
</rule>
<rule name="SEO - non-canonical redirect" stopProcessing="true">
<match url="^(.*)" />
<conditions>
<add input="{Redirect}" pattern="true" />
</conditions>
<action type="Redirect" url="{R:1}" />
<serverVariables>
<set name="Redirect" value="false" />
</serverVariables>
</rule>
</rules>
现在它的大部分实际上工作得很好,但我似乎对裸域有一些问题。
如果我使用带有 www 的子域(应该重定向到非 www),那么它似乎失败了。有趣的是,如果我转到子页面,它可以正常工作。
(我不能发布更多的网址,因为我是新来的:(我想感谢其他人让我开始做这件事。)
我已经将它追溯到服务器变量{HTTP_URL}
,因为如果我删除它,它不会失败。然而,它当然也没有做它应该做的事情(它总是重定向到裸域)。我尝试了各种变量:{URL}
,{REQUEST_URI}
它们似乎都以相同的错误结束,这有点烦人。
如果有人对规则有一些改进,请随时回复,我喜欢与他们合作,我想做出近乎完美的重定向,所以欢迎任何建议。