web-dev-qa-db-ja.com

IIS URL書き換えとWeb.config

私はIISについて何も理解していませんが、すべての訪問者をdomain.com/pageからdomain.com/page.htmlにリダイレクトするというこの問題を解決しようとしています。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.webServer>
    <rewrite>
          <rewriteMaps>
              <rewriteMap name="StaticRedirects">
                  <add key="/page" value="/page.html" />
              </rewriteMap>
            </rewriteMaps>
      </rewrite>
  </system.webServer>
</configuration>

いくつかの問題が発生します。

  1. ファイルをどこに置くかさえわかりません。ユーザールートディレクトリとhtdocsディレクトリがありますが、両方試してみましたが、喜びはありません。
  2. アカウントで書き換えができるかどうかさえ知りません。それを見つけようとしています。
54
J. Martin

1)既存のweb.config:書き換えマップを宣言していますが、それを使用するルールを作成していません。 RewriteMap自体はまったく何もしません。

2)以下は、それを行う方法です(書き換えマップを利用しません-ルールのみ、少量の書き換え/リダイレクトには適しています):

このルールは、SINGLE EXACT rewrite(internal redirect)/page to /page.htmlを実行します。ブラウザのURLは変更されません。

<system.webServer>
    <rewrite>
        <rules>
            <rule name="SpecificRewrite" stopProcessing="true">
                <match url="^page$" />
                <action type="Rewrite" url="/page.html" />
            </rule>
        </rules>
    </rewrite>
</system.webServer>

このルール#2は上記と同じですが、ブラウザーでURLが変更される場所で301リダイレクト(永続的なリダイレクト)を行います。

<system.webServer>
    <rewrite>
        <rules>
            <rule name="SpecificRedirect" stopProcessing="true">
                <match url="^page$" />
                <action type="Redirect" url="/page.html" />
            </rule>
        </rules>
    </rewrite>
</system.webServer>

ルール#3は、拡張子が.htmlのファイルがある場合、任意のURLに対してそのような書き換えを実行しようとします(つまり、/pageの場合、/page.htmlが存在するかどうかを確認し、存在する場合は書き換えが発生します):

<system.webServer>
    <rewrite>
        <rules>
            <rule name="DynamicRewrite" stopProcessing="true">
                <match url="(.*)" />
                <conditions>
                    <add input="{REQUEST_FILENAME}\.html" matchType="IsFile" />
                </conditions>
                <action type="Rewrite" url="/{R:1}.html" />
            </rule>
        </rules>
    </rewrite>
</system.webServer>
113
LazyOne

LazyOneの答えに欠けているものを1つ指摘したかっただけです(答えの下にコメントしただけですが、十分な担当者がいません)

永続リダイレクトのルール#2には、欠落しているものがあります。

redirectType="Permanent"

したがって、ルール#2は次のようになります。

<system.webServer>
    <rewrite>
        <rules>
            <rule name="SpecificRedirect" stopProcessing="true">
                <match url="^page$" />
                <action type="Redirect" url="/page.html" redirectType="Permanent" />
            </rule>
        </rules>
    </rewrite>
</system.webServer>

編集

URL書き換えモジュールの使用方法の詳細については、次の優れたドキュメントを参照してください。 RL書き換えモジュール構成リファレンス

コメントからの@kneidels質問への回答; URLを一致させるには、topic.php?id=39次のようなものを使用できます。

<system.webServer>
  <rewrite>
    <rules>
      <rule name="SpecificRedirect" stopProcessing="true">
        <match url="^topic.php$" />
        <conditions logicalGrouping="MatchAll">
          <add input="{QUERY_STRING}" pattern="(?:id)=(\d{2})" />
        </conditions>
        <action type="Redirect" url="/newpage/{C:1}" appendQueryString="false" redirectType="Permanent" />
      </rule>
    </rules>
  </rewrite>
</system.webServer>

これはtopic.php?id=abに一致します。ここで、a0-9の間の任意の数で、bは0-9の間の任意の数です。その後、/newpage/xyにリダイレクトされます。ここで、xyは元のURLに由来します。私はこれをテストしていませんが、うまくいくはずです。

13
Hjalti

このルールを試してみましたが、GoDaddyホスティングでは、IIS 7アカウントごとにMicrosoft URL書き換えモジュールが既にインストールされているため、うまく機能しました。

<rewrite>
  <rules>
    <rule name="enquiry" stopProcessing="true">
      <match url="^enquiry$" />
      <action type="Rewrite" url="/Enquiry.aspx" />
    </rule>
  </rules>
</rewrite>
10
nolimit