0

iis.net フォーラムで仲間の開発者を助けようとした後、リダイレクトを行うためのより良い方法を探し始めました。そして、私はこの記事に行き着きました。

私はこれらのアイデアをたくさん取り入れて、独自のバージョンを実装し始めました。すべて問題なく動作しているように見えましたが、途中でぶつかりました。助けていただければ幸いです。

さて、私のルールの簡単な説明:

私の考えは、URL をテストすることです。何か問題が見つかった場合は、すぐにリダイレクトするのではなく、URL を書き直して続行します。任意の時点で URL を書き換える場合は、カスタム サーバー変数 "Redirect" を true に設定します。最後に、カスタム サーバー変数が true かどうかをテストし、ユーザーをリダイレクトします。

ポイントは、一連のリダイレクトではなく、301 リダイレクトを 1 つだけにすることです。

これらは私のルールです(壁でごめんなさい):

<rules>
  <rule name="WhiteList - resources" stopProcessing="true">
    <match url="^resources/" />
    <conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
    <action type="None" />
  </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="Rewrite" url="http://{C:1}.{C:2}.{C:3}{HTTP_URL}" />
    <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="http://www.{HTTP_HOST}{HTTP_URL}" />
    <serverVariables>
      <set name="Redirect" value="true" />
    </serverVariables>
  </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" />
    </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$" />
    <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}" />
    <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}" />
    <serverVariables>
      <set name="Redirect" value="false" />
    </serverVariables>
  </rule>
</rules>

現在、そのほとんどは実際にはかなりうまく機能していますが、ネイキッド ドメインにはいくつか問題があるようです。

www を含むサブドメイン (www 以外にリダイレクトする必要があります) を使用すると、失敗したように見えます。面白いことに、サブページに移動すると、正常に動作します。

(私はここに来たばかりなので、これ以上の URL を投稿することはできません :( そして、これを始めた他の人たちにクレジットを与えたいと思いました。)

{HTTP_URL}削除しても失敗しないため、サーバー変数まで追跡しました。ただし、もちろん、想定されていることも実行しません (常にネイキッド ドメインにリダイレクトします)。さまざまな変数を試してみました: {URL}{REQUEST_URI}それらはすべて同じエラーで終わるようで、少し面倒です。

誰かがルールを改善する必要がある場合は、気軽に返信してください。私は彼らと協力するのが大好きで、ほぼ完璧なリダイレクトを行いたいので、どんな提案も大歓迎です.

4

2 に答える 2

1

私は今、実際に答えを見つけたと信じています。私はしばらくの間それを回避し、別の問題に行き着きました。これもwwwと非wwwです。それは単に何もしませんでした。

だから私はそれを最後に置き、それを書き換えるのではなくリダイレ​​クトすることになりました。どうやらそれはうまくいくようですが、なぜですか?わかりません。

^(.+)$Cheesemacfly は、ではなくon に一致することを提案しました(.*)。私はそれがまったく同じことをするだろうと思っていましたが、一致はホスト名にまったくないことに気付きました。そこには大きな驚きがありましたが、新しい可能性が開かれました。

{URL}一致する、{HTTP_URL}またはほぼ同じものの他のバリアントの代わりに、単に一致を参照することができます{R:1}

最初の投稿以来、私は2つのことを入れました。そのシステムとバックエンドに適用したくないほとんどのルールで作業しているため、「umbraco」が含まれている場合は除外するルールのいくつかに条件を付けました。SSLチェック用の書き換えマップも適用したので、サーバー変数に自動的に配置https://または使用しますhttp://{HTTPS}

これまでのところ、バグは見つかっていないので、これを解決済みとしてマークし、ルールの最終改訂版を提供します。楽しみ :)

<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>

ただし、注意点があります。カスタム サーバー変数が使用されていることに注意してください。カスタム サーバー変数をすぐに使用することはできません。この変数を、IIS のグローバル構成ファイルであるファイル内の<allowedServerVariables/>要素に追加する必要があります。applicationHost.config(ソース) 共有ホスティング (Azure Web サイトを含む) を使用している場合、この設定を変更できない可能性があります。

Azure Web ロールを使用している場合は、前述の構成ファイルを変更するスタートアップ タスクを追加する必要があります。これを行わないと、IIS 500 エラーが発生します。

ルールをより良くするための提案があれば、歓迎します。

于 2013-02-06T16:13:46.417 に答える