Iis 一个重定向来控制它们

Iis 一个重定向来控制它们,iis,redirect,url-rewriting,seo,url-redirection,Iis,Redirect,Url Rewriting,Seo,Url Redirection,在尝试在iis.net论坛上进行重定向后,我开始寻找更好的重定向方法。这样我就得到了 我接受了很多这些想法,并开始实施我自己的版本。一切似乎都很顺利,但我在路上遇到了一个障碍,希望你能帮忙 好的,那么,对我的规则做一个简单的解释: 我的想法是测试url,如果我发现它有问题,我会重写url并让它继续,而不是立即重定向它。如果在任何时候重写url,我都会将自定义服务器变量“Redirect”设置为true。最后,我测试自定义服务器变量是否为true,并重定向用户 它的要点是只有一个301重定向,而不

在尝试在iis.net论坛上进行重定向后,我开始寻找更好的重定向方法。这样我就得到了

我接受了很多这些想法,并开始实施我自己的版本。一切似乎都很顺利,但我在路上遇到了一个障碍,希望你能帮忙

好的,那么,对我的规则做一个简单的解释:

我的想法是测试url,如果我发现它有问题,我会重写url并让它继续,而不是立即重定向它。如果在任何时候重写url,我都会将自定义服务器变量“Redirect”设置为true。最后,我测试自定义服务器变量是否为true,并重定向用户

它的要点是只有一个301重定向,而不是一个重定向链

这是我的规则(对不起墙):


现在,它的大部分功能实际上运行得很好,但我发现裸域存在一些问题

如果我使用www(应该重定向到非www)获取子域,那么它似乎失败了。有趣的是,如果我去一个子页面,它工作得很好

(我不能发布更多的URL,因为我是新来的:(我想感谢其他人让我开始做这件事。)

我把它追溯到服务器变量
{HTTP\u URL}
,因为如果我删除它,它不会失败。但是它当然也不会做它应该做的事情(它总是重定向到裸域)。我尝试了各种变量:
{URL}
{REQUEST\u URI}
而且它们似乎都以相同的错误结束,这让人有点恼火


如果有人对规则有一些改进,请随时回复,我喜欢与他们一起工作,并且我想进行近乎完美的重定向,因此欢迎提出任何建议。

我相信我现在确实找到了答案。我花了一段时间研究了它,最后发现了另一个问题,再次是www vs non-www。这是我什么也没做

所以我最后把它放在了最后,并进行了重定向,而不是重写。很明显,这很好,为什么?不知道

Cheesemacfy建议我匹配^(+)$,而不是(.*) 我原以为它也会做同样的事情,但意识到匹配根本不在主机名上,而是后面的一切。这给我带来了巨大的支持,但它确实开启了一种新的可能性

与其匹配{URL}、{HTTP_URL}或其他类似的变体,我可以简单地引用{R:1}的匹配

从第一篇文章开始,我就做了两件事。我在一些规则上设置了条件,以便在我使用该系统时排除其中包含的umbraco以及我不想应用于后端的大多数规则。我还为SSL检查应用了重写映射,因此它会使用服务器变量{https}自动将您放到https://或http://上

到目前为止,我还没有发现任何漏洞,所以我会将此标记为已解决,并给您我的最后一次修订规则,请欣赏:)


)
如果您使用的是共享主机(包括Azure网站),则可能无法更改此设置

如果您使用的是Azure Web角色,则需要添加一个启动任务来修改前面提到的配置文件。如果不这样做,将出现IIS 500错误


如果有人对如何改进规则提出了建议,他们仍然欢迎。

这更像是一个版本1,因此我对其进行了改进,以避免使用服务器变量。 现在,我使用一系列重写规则将url转换为我喜欢的内容,并添加下划线。 然后去掉下划线,然后重定向。 它已经为我工作了很长一段时间了,并且被公司用于几乎所有的项目。 它已被制作成一个nuget软件包,便于安装。

如果您将
url=“(.*)”
更改为
url=“^(+)$”
在您不工作的情况下该怎么办?
<rewrite>
    <rules>
        <rule name="WhiteList - resources" stopProcessing="true">
            <match url="^resources/" />
            <conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
            <action type="None" />
        </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" />
                <add input="{URL}" pattern="^/umbraco/" 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$" />
            <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
                <add input="{URL}" pattern="^/umbraco/" negate="true" />
            </conditions>
            <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}" />
            <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
                <add input="{URL}" pattern="^/umbraco/" negate="true" />
            </conditions>
            <serverVariables>
                <set name="Redirect" value="true" />
            </serverVariables>
        </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="Redirect" url="{MapSSL:{HTTPS}}{C:1}.{C:2}.{C:3}/{R:1}" redirectType="Permanent" />
            <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="{MapSSL:{HTTPS}}www.{HTTP_HOST}/{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}" redirectType="Permanent"/>
            <serverVariables>
                <set name="Redirect" value="false" />
            </serverVariables>
        </rule>
    </rules>
    <rewriteMaps>
        <rewriteMap name="MapSSL" defaultValue="OFF">
            <add key="ON" value="https://" />
            <add key="OFF" value="http://" />
        </rewriteMap>
    </rewriteMaps>
</rewrite>