Настройка индексации PHP файлов: от index.php до динамических маршрутов
Управление индексацией PHP страниц: подходы и примеры
Как настроить canonical URL для index.php и избежать дублей?
Наиболее эффективное решение - использование канонических URL (rel="canonical") в сочетании с HTTP заголовком X-Robots-Tag. Это позволяет указать поисковой системе предпочтительный адрес страницы, даже если контент доступен по нескольким путям (например, https://example.com/ и https://example.com/index.php).
<?php
// В index.php или в общем хидере
$canonical = 'https://' . $_SERVER['HTTP_HOST'] . parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
echo '<link rel="canonical" href="' . htmlspecialchars($canonical) . '" />';
?>
Также можно установить заголовок через PHP:
header('Link: <https://example.com/>; rel="canonical"');
Для всего сайта можно добавить в корневой .htaccess:
RewriteEngine On
RewriteCond %{THE_REQUEST} /index\.php
RewriteRule ^(.*)index\.php$ /$1 [R=301,L]
Типичная ошибка: канонический URL указывает на страницу с GET параметрами, которые не являются значимыми. Решение - очищать параметры при построении canonical. Также часто забывают добавить канонический тег на страницы с пагинацией, что приводит к дублированию.
Как запретить индексацию конкретных PHP файлов через robots.txt?
Если определённые PHP страницы не должны попадать в поиск (например, скрипты обработки форм), используется файл robots.txt.
User-agent: *
Disallow: /process.php
Disallow: /admin/
Disallow: /*?action=
Важно: robots.txt не гарантирует полное исключение - поисковые системы могут проиндексировать страницу, если на неё ведут внешние ссылки. Для полного запрета используйте meta robots.
Ошибка: случайное блокирование CSS и JS файлов, что ломает отображение сайта в поиске. Решение - разрешить доступ к статике.
Как на уровне страницы указать, что она не должна индексироваться?
Для временных страниц (спасибо за заказ, сообщения об ошибках) используйте meta robots noindex, nofollow.
<?php
if ($page_type === 'error' || $page_type === 'thankyou') {
echo '<meta name="robots" content="noindex, nofollow" />';
}
?>
Такой мета-тег можно добавить и в HTML-шаблон.
Частая проблема: noindex указан, но страница все ещё появляется в выдаче из-за кеша поисковой системы. Решение - используйте X-Robots-Tag в HTTP заголовках.
Как скрыть index.php из URL с помощью mod_rewrite?
Чистые URL улучшают индексацию. Через .htaccess все запросы к index.php перенаправляются на корень.
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
Также можно убрать index.php из адреса при прямом обращении:
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/index\.php[\s?] [NC]
RewriteRule ^(.*)index\.php$ /$1 [R=301,L]
Ошибка: неправильные правила приводят к бесконечным циклам перенаправления. Решение - проверять условие на существование файла и директории.
Как управлять индексацией страниц с GET параметрами?
Страницы вида index.php?page=1&filter=red могут создавать дубли. Используйте canonical с нормализованным URL или блокируйте через robots.txt.
<?php
// Нормализация параметров
$params = ['page', 'filter'];
$query = array_intersect_key($_GET, array_flip($params));
$canonical = 'https://example.com/catalog?' . http_build_query($query);
?>
В robots.txt можно запретить все динамические страницы с параметрами, если они не нужны.
Проблема: запрет всех параметров может скрыть полезные фильтры. Решение - разрешить только определённые параметры через регулярные выражения.
Расширенные примеры кода для управления индексацией PHP страниц
1. Канонический URL для страниц с несколькими версиями
Пример, когда сайт доступен как с www, так и без, и с index.php.
<?php
// Определяем предпочтительный домен
$host = 'example.com';
$uri = $_SERVER['REQUEST_URI'];
$uri = preg_replace('#/index\.php#', '', $uri);
$canonical = 'https://' . $host . $uri;
header('Link: <' . $canonical . '>; rel="canonical"');
?>
Результат: поисковые системы понимают, что https://example.com/ и https://example.com/index.php - это одна страница с главным адресом без index.php.
2. Динамический robots.txt, генерируемый через PHP
Можно создать файл robots.php, который выводит правила в зависимости от окружения.
<?php
header('Content-Type: text/plain');
$env = getenv('APP_ENV') ?: 'production';
?>
User-agent: *
Disallow: /admin/
Disallow: /temp/
<?php if ($env === 'staging'): ?>
Disallow: /
<?php else: ?>
Sitemap: https://example.com/sitemap.xml
<?php endif; ?>
Результат: для staging-сервера запрещена индексация всего сайта, для продакшена разрешена.
3. Полный запрет индексации через X-Robots-Tag для определённых типов PHP страниц
<?php
// В начале скрипта проверяем условие
if (strpos($_SERVER['REQUEST_URI'], '/admin') === 0 || isset($_GET['tmp'])) {
header('X-Robots-Tag: noindex, nofollow', true);
}
?>
Результат: все адреса, начинающиеся с /admin или содержащие параметр tmp, не индексируются.
4. RewriteRule для преобразования index.php?page=2 в /page/2/
RewriteEngine On
RewriteRule ^page/([0-9]+)/?$ index.php?page=$1 [L,QSA]
RewriteCond %{QUERY_STRING} ^page=([0-9]+)$
RewriteRule ^index\.php$ /page/%1? [R=301,L]
Результат: пользователь по ссылке /page/2/ видит чистый URL, а если введёт index.php?page=2, то будет перенаправлен на /page/2/.
5. Использование meta robots со временным разрешением индексации
<?php
// Разрешить индексацию только после определённой даты
$allowAfter = strtotime('2025-06-01');
if (time() < $allowAfter) {
echo '<meta name="robots" content="noindex, nofollow" />';
}
?>
Результат: страница будет скрыта от индексации до 1 июня 2025 года, после чего станет доступна.