web-dev-qa-db-ja.com

IIS7 URL書き換え:書き換えられたURLからHTTPSプロトコルを削除しない方法は?

IIS 7のURL書き換え機能を使用して、example.comからwww.example.comへの永続的なリダイレクトを実行し、同様のドメイン名から「」に書き換えるWebサイトに取り組んでいます。 www.examples.comからwww.example.comなどのメイン」のもの。

この書き換えルール(以下に示す)は、しばらくの間うまく機能しています。ただし、最近HTTPSサポートを追加し、ユーザーがURLの1つにアクセスしてwww.example.comに書き換えると、HTTPSが削除されることに気付きました。たとえば、ユーザーが https://example.com にアクセスすると、 http://www.example.com にリダイレクトされますが、送信されるようにします。 to https://www.example.com

関心のある書き換えルール(Web.config内)は次のとおりです。

<rule name="Canonical Host Name" stopProcessing="true">
    <match url="(.*)" />

    <conditions logicalGrouping="MatchAny">
        <add input="{HTTP_Host}" pattern="^example\.com$" />
        <add input="{HTTP_Host}" pattern="^(www\.)?example\.net$" />
        <add input="{HTTP_Host}" pattern="^(www\.)?example\.info$" />
        <add input="{HTTP_Host}" pattern="^(www\.)?examples\.com$" />
    </conditions>

    <action type="Redirect" url="http://www.example.com/{R:1}" redirectType="Permanent" />
</rule>

ご覧のとおり、アクション要素のurl属性はhttp://を直接指しているので、 https://example.comhttp://www.example .com 。私の質問は、どうすればこれを修正できますか? url属性からhttp://の部分を削除しようとしましたが、うまくいきませんでした。

23
Scott Mitchell

私の同僚の助けを借りて答えを見つけました。

{HTTPS}を条件として複数のルールを使用する必要がありました。以下のルールの{HTTPS}条件に注意してください。

<rule name="Canonical Host Name (HTTP)" stopProcessing="true">
    <match url="(.*)" />

    <conditions logicalGrouping="MatchAny">
        <add input="{HTTPS}" pattern="OFF" />
        <add input="{HTTP_Host}" pattern="^example\.com$" />
    </conditions>

    <action type="Redirect" url="http://www.example.com/{R:1}" redirectType="Permanent" />
</rule>

<rule name="Canonical Host Name (HTTPS)" stopProcessing="true">
    <match url="(.*)" />

    <conditions logicalGrouping="MatchAny">
        <add input="{HTTPS}" pattern="ON" />
        <add input="{HTTP_Host}" pattern="^example\.com$" />
    </conditions>

    <action type="Redirect" url="https://www.example.com/{R:1}" redirectType="Permanent" />
</rule>

次に、代替ドメイン名について上記のルールペアを繰り返しました。

11
Scott Mitchell

これが、ハサンの改良によるスコットの答えです。これは、SSLと非SSLの混合サイトをカバーする必要があります。ルールは基本的に「URLにwww.example.comがない場合」と言っており、永続的にリダイレクトします。基本的に...あなたはwwwなしで、または直接あなたのIPアドレスにあなたを訪問する人々をリダイレクトしています。

<rewrite>
<rules>
    <rule name="Canonical Host Name" stopProcessing="true">
        <match url="(.*)" />
        <conditions logicalGrouping="MatchAll">
            <add input="{HTTP_Host}" pattern="^www\.example\.com$" negate="true" />
        </conditions>
        <action type="Redirect" url="{MapSSL:{HTTPS}}www.example.com/{R:1}" redirectType="Permanent" />
    </rule>
</rules>
<rewriteMaps>
    <rewriteMap name="MapSSL" defaultValue="http://">
        <add key="ON" value="https://" />
        <add key="OFF" value="http://" />
    </rewriteMap>
</rewriteMaps>
</rewrite>
40
Ralph N

(最後のサンプルのように)現在使用されているプロトコルに基づいてリダイレクトしたい場合は、必要なルールの量を半分にするはるかに簡単なソリューションがあります。以下は、私の同僚から学んだことです。

ご覧のとおり、{HTTPS}引数には値ONまたはOFFが含まれます。この値をリライトマップにフィードすることで、この値をhttps://またはhttp://にマップできます。

これがどのように機能するかを次に示します。

1- {HTTPS}値をマッピングするためのrewritemapセクションを作成します。

    <rewriteMap name="MapProtocol" defaultValue="OFF">
      <add key="ON" value="https://" />
      <add key="OFF" value="http://" />
    </rewriteMap>

プロトコルのみを含めるか、セミコロンとスラッシュも含めるかはあなた次第です。解決策は重要ではありませんが、どこで参照する場合でも覚えておいてください。

2-必要に応じてこのマップを参照してください。このサンプルでは、​​アウトバウンドルールで使用されていますが、シナリオでも機能します。

    <rule name="Outbound-Rule Name" stopProcessing="true" preCondition="ResponseIsHtml">
      <match filterByTags="A, Link, Script" pattern="YOUR PATTERN" />
      <action type="Rewrite" value="{MapProtocol:{HTTPS}}{HTTP_Host}/REST OF RELATIVE LINK HERE" />
    </rule>

これで、URL Rewriteモジュールは、httpsを使用しているか、もちろんhttpを使用しているかに応じて、リンクに正しいプロトコルを自動的に使用する必要があります。

お役に立てれば!

7

これは、example.comだけでなく任意のドメインでも機能するクロスドメインソリューションです。

<rewrite>
    <rules>
        <rule name="Canonical Host Name" stopProcessing="true">
            <match url="(.*)" />
            <conditions logicalGrouping="MatchAll">
                <add input="{HTTP_Host}" pattern="^www\.([.a-zA-Z0-9]+)$" negate="true" />
            </conditions>
            <action type="Redirect" url="{MapProtocol:{HTTPS}}www.{HTTP_Host}/{R:0}" redirectType="Permanent" />
        </rule>
    </rules>
    <rewriteMaps>
        <rewriteMap name="MapProtocol" defaultValue="OFF">
            <add key="ON" value="https://" />
            <add key="OFF" value="http://" />
        </rewriteMap>
    </rewriteMaps>
</rewrite>
1
Twisted Whisper