Где кэшируется переадресация?

Ссылка скопирована
1 ответ

На сайте настроено перенаправление с динамическим формированием URL с зависимостью от местоположения посетителя.

Проблема в том, что при включении кэширования страниц сайта (через плагины WordPress) кэшируется в том числе и переадресация.

Кто сталкивался с подобной проблемой? Не могу найти информацию где кэшируется URL перенаправления.

Дополнительно:

А какой плагин используете и как сделано динамическое формирование url?

  • Stanislav K, ответы на вопросы:
    1) Проблема встречается при использовании плагина WP Rocket.
    2) Динамическое формирование URL реализовано так: При загрузке страницы по IP посетителя определяется город и посетитель перенаправляется на аналогичную страницу регионального сайта на поддомене. Например: С site.ru/usluga перенаправление на moscow.site.ru/usluga, так как посетитель находится в Москве.
  • Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Роман IT Ответ

    В вашем случае кэшируется не "URL переадресации" в отдельном месте, а HTTP-ответ страницы. Если при первом заходе страница отдала редирект 301/302 на региональный поддомен, плагин кэша, CDN или браузер могут сохранить этот ответ и отдавать его следующим пользователям без повторного определения города.

    При WP Rocket чаще всего проблема в page cache: динамический редирект по IP выполняется до генерации страницы, а результат попадает в кэш. Для геозависимых редиректов это плохая схема, потому что HTML-кэш обычно общий для всех посетителей.

    Что делать:

    1. Исключить страницы с георедиректом из кэша WP Rocket.
    2. Не делать постоянный 301 для георедиректа. Используйте 302 или 307.
    3. Добавить заголовки запрета кэширования на ответ с редиректом.
    4. Если есть CDN, проверить правила кэширования 3xx-ответов.

    Пример для WordPress:

    function site_geo_redirect() {
        if (is_admin() || wp_doing_ajax()) {
            return;
        }
     
        $target_url = site_get_geo_target_url();
     
        if (!$target_url || $target_url === home_url(add_query_arg([], $_SERVER['REQUEST_URI'] ?? '/'))) {
            return;
        }
     
        nocache_headers();
        header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0');
        header('Pragma: no-cache');
     
        wp_safe_redirect($target_url, 302);
        exit;
    }
    add_action('template_redirect', 'site_geo_redirect', 1);

    function site_geo_redirect() { if (is_admin() || wp_doing_ajax()) { return; } $target_url = site_get_geo_target_url(); if (!$target_url || $target_url === home_url(add_query_arg([], $_SERVER['REQUEST_URI'] ?? '/'))) { return; } nocache_headers(); header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0'); header('Pragma: no-cache'); wp_safe_redirect($target_url, 302); exit; } add_action('template_redirect', 'site_geo_redirect', 1);

    Если редирект зависит от IP, нельзя безопасно кэшировать одну и ту же страницу для всех. Альтернативный вариант - не редиректить на сервере, а показывать пользователю баннер выбора города или выполнять клиентский редирект после определения региона через JS/API. Это хуже для SEO, но снижает риск отдавать московский редирект всем посетителям.

    Для диагностики проверьте заголовки ответа через curl -I: если видите X-Rocket-Cache: HIT или похожий HIT на 302-ответе, значит редирект действительно попал в кэш.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно