23

複数の異なるドメインからアクセスできる ASP.NET MVC 4 Web アプリケーションがあります。サイトは、リクエストのドメインに基づいて完全にローカライズされています (概念はこの質問に似ています)。

robots.txt ファイルを含め、ドメインに基づいて robots.txt ファイルをローカライズしたいのですが、サイトのファイル システム ディレクトリに物理的な「robots.txt」テキスト ファイルを 1 つしか持てないことを認識しています。

同じサイトのインストールがすべてのドメインにコンテンツを提供するように、ASP.NET MVC フレームワークを使用してドメインごとに robots.txt ファイルを作成するための最も簡単で最良の方法は何ですか (そしてそれは可能ですか)。 robots ファイルは、要求されたドメインに応じてローカライズされていますか?

4

2 に答える 2

56

プロセスはかなり単純です。

コントローラー/アクション アプローチ

  • ルート テーブルを使用して、robots.txt パスをコントローラー内のアクションにマップします (開始するための簡単な例として、コントローラーとアクションを使用します)。これは、特定のパスの他のコントローラーとビューを行う場合と同じです。
  • アクション内で、リクエストのドメインを確認し、そのドメインの robots.txt コンテンツを選択します。
  • 次のようなものを使用して、ディスクから適切なファイルを返します。
    • ContentResultに設定ContentTypeする"text/plain"
    • FilePathResultロボット ファイルがディスク上の単なるファイルである場合は、次のControllerようなクラスのヘルパー メソッドのいずれかを使用します。File(name, "text/plain")

次のサンプルでは、​​単一の最上位レベルの robots.txt ファイルを想定しています。

// In App_Start/RouteConfig:
public static void RegisterRoutes(RouteCollection routes)
{
  routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
  routes.MapRoute(
    name: "robots",
    url: "robots.txt",
    defaults: new { controller = "Seo", action = "Robots" }
);

// The controller:
public class SeoController : Controller {
  public ActionResult Robots() {
    var robotsFile = "~/robots-default.txt";
    switch (Request.Url.Host.ToLower()) {
      case "stackoverflow.com":
        robotsFile = "~/robots-so.txt";
        break;
      case "meta.stackoverflow.com":
        robotsFile = "~/robots-meta.txt";
        break;
    }
    return File(robotsFile, "text/plain");
  }
}

これを機能させる最も簡単な方法の 1 つは、web.config を使用してすべての要求に対してルーティング モジュールが呼び出されるようにすることですrunAllManagedModulesForAllRequests(これは使用しないでください。次の段落を参照してください)。

<system.webServer>
  <handlers>
    ...
  </handlers>
  <modules runAllManagedModulesForAllRequests="true" />
</system.webServer>

これは、すべての静的ファイル (css、js、txt) が静的ファイル ハンドラーに転送される前にマネージド ハンドラーを通過するため、一般的には良いことではありません。IIS は静的ファイルを高速に処理するのが得意です (大部分が静的ファイルの Web サイトでは、CPU よりも前にディスク I/O が限界に達します)、このパフォーマンスへの影響を回避するには、以下の web.config サンプル セクションのようなアプローチをお勧めします。ExtensionlessUrlHandler-Integrated-4.0Visual Studio MVC 4 テンプレート アプリケーションのハンドラーと類似していることに注意してください。

<system.webServer>
  <handlers>
    <add name="Robots-Integrated-4.0"
         path="/robots.txt" verb="GET" 
         type="System.Web.Handlers.TransferRequestHandler" 
         preCondition="integratedMode,runtimeVersionv4.0" />
    ... the original handlers ...
  </handlers>
  <modules runAllManagedModulesForAllRequests="false" />
</system.webServer>       

利点/欠点

このタイプのアプローチの利点は、使い始めると明らかになります。

  • ヘルパーを使用してアクション URL を生成することにより、robots.txt ファイルを動的に生成し、そのすべてまたは一部をテンプレート robots.txt ファイルに追加できます。
  • ロボット ユーザー エージェントをチェックして、ロボット ユーザー エージェントごとに異なるロボット ファイルを返すことができます
  • 同じコントローラーを使用して、Web クローラー用の sitemap.xml ファイルを出力できます。
  • サイト ユーザーが簡単に管理できるデータベース テーブルから、ロボットのコンテンツを管理できます。

マイナス面では、

  • あなたの robots ファイルはルートテーブルを複雑にしていますが、実際にはそうする必要はありません
  • 一定のディスク読み取りを防ぐために、キャッシュを最適化する必要があります。ただし、これはどのアプローチをとっても同じです。

サブディレクトリごとに異なる robots.txt ファイルを使用できることにも注意してください。これは、ルートとコントローラーのアプローチでは扱いにくいため、IHttpHandlerこの状況ではアプローチ (以下) の方が簡単です。

IHttpHandler アプローチ

IHttpHandler web.config に登録されたカスタムでこれを行うこともできます。カスタム ルート ハンドラをルート テーブルに追加するのとは異なり、すべてのコントローラにすべてのリクエストを表示させる必要がなくなるため、カスタムを強調します。runAllManagedModulesForAllRequests="true"

これは、コントローラーよりも軽量なアプローチである可能性もありますが、違いに気付くには膨大なサイト トラフィックが必要です。その他の利点は、すべてのサイトで使用できる再利用可能なコードです。カスタム構成セクションを追加して、ロボット ユーザー エージェント/ドメイン名/パス マッピングをロボット ファイルに構成することもできます。

<system.webServer>
  <handlers>
    <add name="Robots" verb="*" path="/robots.txt"
         type="MyProject.RobotsHandler, MyAssembly" 
         preCondition="managedHandler"/>
  </handlers>
  <modules runAllManagedModulesForAllRequests="false" />
</system.webServer>
public class RobotsHandler: IHttpHandler
{
  public bool IsReusable { get { return false; } }
  public void ProcessRequest(HttpContext context) {
    string domain = context.Request.Url.Host;
    // set the response code, content type and appropriate robots file here
    // also think about handling caching, sending error codes etc.
    context.Response.StatusCode = 200;
    context.Response.ContentType = "text/plain";

    // return the robots content
    context.Response.Write("my robots content");
  }
}

サブディレクトリの robots.txt

サブディレクトリとサイト ルートのロボットにサービスを提供するには、コントローラー アプローチを簡単に使用することはできません。このシナリオでは、ハンドラー アプローチの方が簡単です。これは、任意のサブディレクトリへの robots.txt ファイル リクエストを取得し、それに応じて処理するように構成できます。次に、一部のディレクトリでは 404 を返し、その他のディレクトリでは robots ファイルのサブセクションを返すことを選択できます。

このアプローチは sitemap.xml ファイルにも使用でき、サイトのさまざまなセクションにさまざまなサイトマップを提供したり、相互に参照する複数のサイトマップなどを提供したりできるため、ここで特に言及します。


その他の参考資料:

于 2013-06-11T06:40:28.980 に答える