<servervariables> <set name =“...”>打破web.config

时间:2015-06-05 11:25:38

标签: iis ssl seo web-config url-redirection

问题的底部有一个TL; DR!

这里......

问题的背景(简单地说)是IIS Rewrite在重定向操作中删除了协议。因此,如果您未在<action type="Redirect" url="whatever"/>中明确指定协议,则url="..."的规则会从https转为http。{/ 1}}。

经过多次Google搜索后,我找到了 this article ,其中介绍了在重定向时保留协议的各种方法。对我来说最有效的方法如下:

url="https://{HOST}"

......出于以下两个原因就是这种情况:

  1. 维护协议需要多个规则。写下2个(一个仅用于http,另一个用于https)是不可行的。

  2. 此文件必须适用于直接SSL连接(其中{HTTP} = on)并与Cloudflare的灵活SSL兼容(其中{HTTP} =关闭但{HTTP_X-Forwarded-Proto}为“http”或“HTTPS”)。

  3. SO,

    我的想法是设置一个我可以用来对重写Map的变量。该变量的值取决于<rule name="Create HTTP_PROTOCOL"> <match url=".*" /> <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> <add input="{CACHE_URL}" pattern="^(.+)://" /> </conditions> <serverVariables> <set name="HTTP_PROTOCOL" value="{C:1}" /> </serverVariables> <action type="None" /> </rule> <rule name="Redirect to www" stopProcessing="true"> <match url="(.*)" /> <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> <add input="{HTTP_HOST}" pattern="^localtest\.me$" /> </conditions> <action type="Redirect" url="{HTTP_PROTOCOL}://www.localtest.me/{R:1}" /> </rule> OR HTTPS=on

    这是我的原始代码,它删除了协议:

    HTTP_X-Forwarded-Proto=https

    这是我的修改后的代码,无论是否存在直接的SSL连接,或者通过CloudFlare的灵活SSL进入连接,都会使用所需的协议进行重定向:

    <!-- remove trailing slashes looses protocol -->
    <rule name="RemoveTrailingSlashRule" stopProcessing="true">
        <match url="(.*)/+$" />
        <conditions>
            <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        </conditions>
        <action type="Redirect" url="{R:1}" />
    </rule>
    

    除,

    A)我得到一个空白页面,url重写失败,没有错误信息。

    B)但是如果我删除了这个标签的两个实例,它就有效:                                   

    TL; DR 为什么这不起作用?

    <!-- rewrite config -->
    <rewrite>
    
      <!-- rewrite maps -->
      <rewriteMaps>
          <rewriteMap name="RedirectBase">
              <add key="http" value="http://{HTTP_HOST}/" />
              <add key="https" value="https://{HTTP_HOST}/" />
          </rewriteMap>
      </rewriteMaps>
    
      <!-- rewrite rules -->
      <rules>
    
        <!-- capture incoming protocol -->
        <rule name="HTTP_PROTOCOL - Capture Default">
          <match url=".*" />
          <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
            <add input="{CACHE_URL}" pattern="^(.+)://" />
          </conditions>
          <serverVariables>
            <set name="HTTP_PROTOCOL" value="{C:1}" />
          </serverVariables>
          <action type="None" />
        </rule>
    
        <!-- overwrite protocol var if using CloudFlare's flexible SSL -->
        <rule name="HTTP_PROTOCOL - Overwrite with CloudFlare header">
          <match url=".*" />
          <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
            <add input="{HTTP_X-Forwarded-Proto}" pattern="^https$" />
          </conditions>
          <serverVariables>
            <set name="HTTP_PROTOCOL" value="{C:1}" replace="true" />
          </serverVariables>
          <action type="None" />
        </rule>
    
        <!-- remove trailing slashes but keep protocol -->
        <rule name="RemoveTrailingSlashRule" stopProcessing="true">
            <match url="(.*)/+$" />
            <conditions>
                <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
            </conditions>
            <action type="Redirect" url="{RedirectBase:{HTTP_PROTOCOL}}{R:1}" />
        </rule>
    
      </rules>
    </rewrite>
    

1 个答案:

答案 0 :(得分:1)

找到了答案!

我必须在URL Rewrite config中手动添加“HTTP_PROTOCOL”到允许的服务器变量列表。这似乎只能通过IIS UI而不是通过web.config文件来完成。的 Full instructions here