Стадартно Razor Pages используют Index как документ по умолчанию, который не обязательно указывать в URL. Но, если вы его укажете, то откроется та же страница, и у вас возникнет дублирование страниц - когда по разным адресам открывается одна и та же страница. То же самое происходит, если указать слеш в конце url.
Чтобы предовратить это поведение, добавьте в Startup.cs в метод Configure(IApplicationBuilder app, IWebHostEnvironment env) перед app.UseStaticFiles(); следующий код:
//ПРЕДВАРИТЕЛЬНО:
var rewriteOptions = new RewriteOptions()
.AddRedirect("(.*)/$", "$1") //убираем слеж в конце адреса
.AddRedirect("((?i)(index))$", "/"); //убираем дубликат стартовой страницы; (?i) это ignorecase
app.UseRewriter(rewriteOptions);
и необходимые пространства имен using Microsoft.AspNetCore.Rewrite;
Запустите и протестируйте проект - страница Index не будет отображаться в url.
📘 Переопределения URL-адресов в ASP.NET Core
- Как отвечает сервер
Посмотрим, что происходит на сервере, если ввести в url страницу по умолчанию, и слеш в конце. Для этого будем использовать средство диагностики броузера, открывается, если нажать F12, вкладка [Network]
Мы видим, что сервер пытался открыть страницу index/ со слешем, потом просто index, и только потом корневую страницу. Во время редиректов возвращается код 302, что означает, что такая страница как бы есть, но временно перемещена. Для поискового робота, это сигнал проверить позже, а не появилась ли такая страница снова.
📘 Как Яндекс обрабатывает внутрихостовые редиректы?
📘 Яндекс: Дублирование страниц
- Редирект 301
Давыйте теперь сократим количество редиректов для index страниц до одного, и сделаем это редирект с кодом 301 - для поисковика это означает, что страница теперь постоянно находится по этому адресу, и всё хорошее, что было связано с этой страницой, например внешние ссылки, надо теперь связать с новой страницей.
var rewriteOptions = new RewriteOptions()
.AddRedirect("(.*)/index/*$", "$1", 301) //убираем дубликаты внутренних страниц
.AddRedirect("index/*$", "$1", 301) //убираем дубликат главной страницы по умолчанию;
.AddRedirect("(.*)/$", "$1", 301); //убираем слеж в конце адреса для других страниц
Здесь мы сначала удаляем дубликаты по умолчанию вместе со слешем, если он есть. Для других страниц, просто удаляет слеш в конце.
Возможно есть более удачное регулярное выражение, чтобы не добавлять отдельную строку для главной страницы. Выражение /*index/* не срабатывает для стартовой страницы Тестирование проводилось для адресов http://localhost:64524/canonical/index/ и http://localhost:64524/index/. Причем редирект хотелось получить только один.
Тестирование страниц с параметрами не проводилось.
✔ ВНИМАНИЕ: В данном коде везде применяется 301 редирект, но это надо обязательно проверить уже на рабочем сервере, возможно, ему, наоборот требуется слеш в конце - тогда надо будут подправить этот код.
Протестируйте работу на главной странице, внутренней странице, и переход по ссылке на главную страницу. Адрес в такой ссылке выглядит как слеш href="/"- проверте, что главная страница открывается без редиректов - это важно, чтобы ваш собственный сайт не генерировал ошибочные ссылки.
📘 Язык регулярных выражений — краткий справочник
🔖 Regex Tester - онлайн тестирование регулярных выражений
Должен быть только один адрес сайта, с WWW или наоборот без него, и при наборе дубликата, должен быть 301 редирект на основной адрес. Кроме того, когда вы размещаете сайт у хостинг провайдера, используется некоторый внутренний технологический адрес сайта. Например, при размещении в Azure у вашего сайта появится внутренний адрес наподобии {некоторое_уникальное_имя}.azurewebsites.net. У других провайдеров имя может быть другим, но, главное - по этому адресу ваш сайт будет также доступен, и если вы надеетесь, что это имя никто не узнает, то на пратике это не так.
- Перезапись URL на IIS
Давайте избавимся от этих дубликатов, но несколько иным способом - с помощью файла конфигурации для IIS, тогда такие запросы будут обрабатываься сервером, и даже не попадуть в нашу программу - и это быстрее.
Добавьте файл веб конфигурации web.config в проект.
(При добавлении нового элемента он находися в разделе Visual C# > ASP.NET Core > Веб > ASP.NET)
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Redirect SITEname" patternSyntax="ECMAScript" stopProcessing="true">
<match url=".*"/>
<conditions logicalGrouping="MatchAny">
<add input="{HTTP_HOST}" pattern="^hosting-site-name.azurewebsites.net$" />
<add input="{HTTP_HOST}" pattern="^www\.(.*)$" />
</conditions>
<action type="Redirect" url="http://site.ru/{R:0}" redirectType="Permanent"/>
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
Это все надо тестировать на своем сервере - там могут быть различные настройки провайдера. Лично я обхожусь без правила
<add input="{HTTP_HOST}" pattern="^www\.(.*)$" />
а в правиле
<add input="{HTTP_HOST}" pattern="^hosting-site-name.azurewebsites.net$" />
можно добавить
<add input="{HTTP_HOST}" pattern="^hosting-site-name.azurewebsites.net(.*)$" />
но при тестировании все работает как надо, и сервер корректно отвечает 301 редиректом на кривые адреса.
📘 Справочник по настройке модуля перезаписи URL, web.config
⬜ 10 советов по переписыванию URL для IIS
Мы поработали над устраннием дублей, теперь пора добавить правильный канонический адрес, и желательно делать это в автоматическом режиме.
Добавьте в файл _Layout.cshtml в самое начало код, формирующий канонический адрес страницы:
@{
//Каноническая ссылка
string path = Context.Request.Path.HasValue ? Context.Request.Path.Value.ToLower().TrimEnd('/') : string.Empty;
if (path.EndsWith("/index")) path = path.Remove(path.Length - 6); //избыточно: перестраховка для редиректа
}
Этот код не учитывает параметры запроса, в большинстве случаев как раз это и требуется, хотя есть и свойство HttpRequest.QueryString для отображения строки запроса.
📘 Доступ к HttpContext в ASP.NET Core
📘 HttpRequest.Path
Теперь добавим канонический адрес страницы в заголовок днной страницы. В разделе <head>, после тега <title>:
<link rel="canonical" href="http://site.ru@(path)">
Вместо http:// site.ru поставьте домен вашено сайта.
📘 Яндекс: канонический адрес страницы
- Важные замечания:
• Сканирование канонического URL будет выполняться намного чаще, чем его копий.
• Присутствие URL в файле Sitemap. Если вы используете xml-карту сайта, то включите туда все канонические url, в точности так, как на странице. И наоборот, не включайте в файл Sitemap неканонические страницы.
📘 Google: Как консолидировать повторяющиеся URL
⬜ полное руководство по использованию канонических ссылок
Практические консультации вы можете получить на наших веб курсах в Сочи, Адлер:

