Можно ли исключить поисковых ботов (таких как Google) из скрипта перенаправления Cloudflare worker?

Я использую Cloudflare worker для перенаправления посетителей на правильную версию веб-сайта следующим образом:

addEventListener('fetch', event => {
    event.respondWith(handleRequest(event.request))
  })

  /**
   * Respond to the request
   * @param {Request} request
   */
  async function handleRequest(request) {
    country_code = request.headers.get('CF-IPCountry');
    var link;

  switch(request.headers.get('CF-IPCountry')) {
    case 'TW':  // Taiwan
    link = "https://www.website.com/twn";
        break;
    case 'TH':  // Thailand
    link = "https://www.website.com/tha";
        break;
    case 'GB':  // United Kingdom
    link = "https://www.website.com/gbr";
        break;
    case 'US':  // United States
    link = "https://www.website.com/us";
        break;
    default:
      link = "https://www.website.com/rotw" // Rest of the world
  }

  return new Response('', {
          status: 301,
          headers: {
            'Location': link
          }
        })
  }

Проблема в том, что бот Google перенаправляется на веб-сайт.com/us, и, таким образом, мой вход в Google направляет входящих посетителей прямо на веб-сайт /us. Есть ли способ исключить поисковых ботов из скрипта перенаправления страны и направить их прямо на веб-сайт.com, а не на веб-сайт.com/код страны?


person Nuokh    schedule 29.01.2020    source источник
comment
Взгляните на robots.txt.   -  person Teemu    schedule 29.01.2020
comment
robots.txt генерируется динамически программным обеспечением php, которое работает на сервере. Изменение его в настоящее время выходит за рамки моей компетенции (к сожалению).   -  person Nuokh    schedule 29.01.2020
comment
Вы не можете сохранить воркер в каталоге, защищенном robots.txt?   -  person Teemu    schedule 29.01.2020


Ответы (1)


Не могли бы вы сделать что-то вроде этого. Я не тестировал это.

addEventListener('fetch', event => {
    event.respondWith(handleRequest(event.request))
  })

  /**
   * Respond to the request
   * @param {Request} request
   */
  async function handleRequest(request) {
    country_code = request.headers.get('CF-IPCountry');
    var link;

  let userAgent = request.headers.get('User-Agent') || ''
  if (userAgent.includes('Googlebot')) {
    return new Response('', {
          status: 301,
          headers: {
            'Location': "https://www.website.com/"
          }
        })
  }

  switch(request.headers.get('CF-IPCountry')) {
    case 'TW':  // Taiwan
    link = "https://www.website.com/twn";
        break;
    case 'TH':  // Thailand
    link = "https://www.website.com/tha";
        break;
    case 'GB':  // United Kingdom
    link = "https://www.website.com/gbr";
        break;
    case 'US':  // United States
    link = "https://www.website.com/us";
        break;
    default:
      link = "https://www.website.com/rotw" // Rest of the world
  }

  return new Response('', {
          status: 301,
          headers: {
            'Location': link
          }
        })
  }
person SpeedOfSpin    schedule 29.01.2020
comment
Хорошо выглядеть! Что такое || '' после let userAgent = request.headers.get('User-Agent') for? - person Nuokh; 29.01.2020
comment
Рад помочь. || это просто сокращенный способ проверки на нуль. если request.headers.get('User-Agent') принимает значение null, то вместо этого он заполняет его пустой строкой. Останавливает ошибку во второй строке. - person SpeedOfSpin; 29.01.2020