Подтвердить что ты не робот

Файл robots.txt для разных доменов одного и того же сайта

У меня есть веб-приложение ASP.NET MVC 4, к которому можно получить доступ из нескольких разных доменов. Сайт полностью локализован на основе домена в запросе (аналогично по концепции этот вопрос).

Я хочу включить файл robots.txt, и я хочу локализовать файл robots.txt на основе домена, но я знаю, что я могу иметь только один физический текстовый файл robots.txt в файловой системе сайта каталог.

Что является самым простым/лучшим способом (и даже возможно) использовать структуру ASP.NET MVC для достижения файла robots.txt для каждого домена, так что одна и та же установка сайта служит для контента для каждого домена, но содержимое файла robots локализуется в зависимости от запрашиваемого домена?

4b9b3361

Ответ 1

Процесс достаточно прост:

Подход контроллера/действия

  • Используя таблицу маршрутов, сопоставьте свой путь 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");
  }
}

Одним из самых простых способов заставить это работать, является обеспечение того, чтобы модуль маршрутизации вызывался для всех запросов с помощью runAllManagedModulesForAllRequests в web.config(не используйте это, см. следующий абзац):

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

Это не очень хорошо, поскольку теперь все статические файлы (css, js, txt) проходят через управляемые обработчики, прежде чем перенаправляться на статический обработчик. IIS действительно хорош в быстром обслуживании статических файлов (в основном статический файл-сайт максимально удаляет ваш диск ввода-вывода перед процессором), поэтому, чтобы избежать этой производительности, рекомендуется использовать рекомендуемый подход в качестве раздела примера web.config. Обратите внимание на сходство с обработчиком ExtensionlessUrlHandler-Integrated-4.0 в приложениях Visual 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>       

Преимущества/недостатки

Преимущества такого подхода становятся очевидными после его использования:

  • Вы можете динамически генерировать файлы robots.txt с помощью помощников для генерации URL-адресов действий, которые затем можно добавить все/часть файла шаблона robots.txt.
  • Вы можете проверить агента пользователя робота, чтобы возвращать разные файлы роботов для каждого пользовательского агента робота.
  • Вы можете использовать один и тот же контроллер для вывода файлов 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, чтобы обслуживать разные файлы Sitemap для разных разделов сайта, несколько файлов Sitemap, которые ссылаются друг на друга и т.д.


Другие ссылки: