网址重写导致“此页面无法显示”

时间:2016-09-16 03:16:39

标签: iis iis-8.5

我已经在服务器级实现了URL重写,因为我想将所有与特定规则匹配的HTTP和HTTPS请求重定向到我的实际站点,并且只有在用户访问我的实际站点时才会进行重定向。规则最初工作正常。但是,在我的实际网站上反复触发CTRL + R似乎使我的网站无法访问。然后将错误“此页面无法显示”返回给用户。此测试在Windows x64上的IE 11浏览器上完成,我的Web服务器在Windows Server 2012 R2上是IIS 8.5。为重定向返回的HTTP响应代码配置为307。

当我在IIS服务器上打开失败请求路由时,我在失败请求日志中的REWRITE_DISABLED_KERNEL_CACHE上看到一条警告消息。这是页面返回“此页面无法显示”的时间。

禁用我的网址重写规则会立即再次访问我的HTTP和HTTPS网站,并且我已验证重定向不再有效。之后在我的HTTPS站点上启用相同的规则只会起作用。

以下是我的重定向规则

<system.webServer>
    ...
    <rewrite>
        <globalRules>
            <clear />
            <rule name="HTTPS to HTTP" enabled="true" stopProcessing="true">
                <match url="^(downloads?/?)?$" />
                <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
                    <add input="{REQUEST_URI}" pattern="http://.*?/downloads/" negate="true" />
                </conditions>
                <action type="Redirect" url="http://{HTTP_HOST}/downloads/" appendQueryString="false" redirectType="Temporary" />
            </rule>
        </globalRules>
        <outboundRules>
        </outboundRules>
    </rewrite>
    ...
</system.webServer>

基本上,如果请求到达以下任何示例网址,我将重定向它们:

1)http://fqdn/download

2)http://fqdn/download/

3)https://fqdn/downloads

4)https://fqdn/downloads/

5)https://fqdn/download

6)https://fqdn/download/

如果请求直接访问我的网站,我将不会重定向:

当我点击我的实际网站时,我意识到重定向规则仍在应用中。所以我怀疑这里可能存在两个不同的问题。

1)将请求发送到http://fqdn/downloads/

时应用无限重定向规则

2)REWRITE_DISABLED_KERNEL_CACHE

的一些未知问题

1 个答案:

答案 0 :(得分:0)

由于您对REQUEST_URI的错误假设以及缺少HTTPS检查,您在无限重定向方面遇到了麻烦。

{REQUEST_URI}包含网址的路径,包括查询字符串,带有前导斜杠(从未被记录过),从不包含uri方案或主机名。所以,你有误报。

  

HTTP(S)://&LT;宿主GT;:其中端口&GT; /<path>?<querystring>

这是一个不言自明的规则。

<rule name="Force Http downloads page" stopProcessing="true">

    <!-- If the url starts with download or downloads with an optional trailing slash -->
    <match url="^downloads?/?$" />

    <!-- Redirect -->
    <action type="Redirect" url="http://{HTTP_HOST}/downloads/" appendQueryString="false" redirectType="Temporary" />

    <!-- When -->
    <conditions logicalGrouping="MatchAny">
        <!-- REQUEST_URI does not start with "/downloads/" -->
        <add input="{REQUEST_URI}" pattern="^/downloads/" negate="true" />

        <!-- Or -->

        <!-- HTTPS is not off -->
        <add input="{HTTPS}" pattern="^off$" negate="true" />
    </conditions>
</rule>

希望它有所帮助。