2016-09-16 87 views
1

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

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

禁用我的URL重写规则会立即使我的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> 

基本上,如果请求命中任何下面的例子中的URL,我将重定向它们:

1)http://fqdn/download

2)http://fqdn/download/

3)https://fqdn/downloads

4)https://fqdn/downloads/

5)https://fqdn/download

6)https://fqdn/download/

我不会重定向,如果请求命中我的网站直接:

当我打我的实际网站,我意识到r编辑规则仍在应用中。所以我怀疑这里可能有两个不同的问题。

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

2)一些未知问题REWRITE_DISABLED_KERNEL_CACHE

回答

0

你在用,因为你的错误assumptation的无限重定向麻烦应用于无限重定向规则有关REQUEST_URI并缺少HTTPS检查。

{REQUEST_URI}包含URL的路径,包括查询字符串领先斜线(从未被welldocumented),决不会包含URI方案或主机名。所以,你有误报。

HTTP(S):// <主机>:<端口> /<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> 

希望它有帮助。

+1

Wao你是一个拯救生命的人!但我做了一些改变。而不是使用REQUEST_URI,我已经转向使用URL,所以至少我使用了一个更好记录的变量。 –

+0

@louisxie因为没有查询字符串作业,这是一个很好的调用。 –

+0

出于某种原因,新规则未成功将https:// /和https:// /重定向到我的预期网站。这是因为IIS评估应用的{URL}条件为true,但{HTTPS}条件为false。因此,我删除了所有应用条件,并将其替换为