Лучшие практики настройки мета-тегов robots и robots.txt

Изучение того, как настроить файл robots.txt и мета-теги robots, является важным элементом успеха в техническом SEO. Это краткое руководство поможет вам правильно их реализовать.

Настройки мета-тегов robots.txt

автор: Anna Crowe

Изучение того, как настроить файл robots.txt и мета-теги robots, является важным элементом успеха в техническом SEO. Это краткое руководство поможет вам правильно их реализовать.

Может быть, это только у меня, или слова "мета-теги robots" и "robots.txt" звучат как что-то, что сказал бы Шварценеггер в "Терминаторе 2"?

Именно поэтому я начал заниматься SEO – казалось, будущее, но в то время чрезмерно техническое для моих навыков.

Надеюсь, это руководство сделает настройку мета-тегов robots и файлов robots.txt менее вызывающей тошноту. Давайте начнем.

Meta Robots Tags против Robots.txt

Прежде чем мы погрузимся в основы того, что такое мета-теги robots и файлы robots.txt, важно знать, что нет одной стороны, которая лучше использовать в SEO.

Файлы robots.txt указывают краулерам, что следует краулить по всему сайту.

В то время как мета-теги robots углубляются в детали конкретной страницы.

Я предпочитаю использовать мета-теги robots для многих вещей, которые другие специалисты SEO могут считать слишком сложными в файле robots.txt.

Нет правильного или неправильного ответа. Это личное предпочтение на основе вашего опыта.

Что такое Robots.txt?

Файл robots.txt сообщает краулерам, что следует краулить.

Это часть протокола исключения краулеров (REP).

Googlebot – пример краулера.

Google разворачивает Googlebot для обхода веб-сайтов и записи информации о сайте для понимания того, как ранжировать сайт в результатах поиска Google.

Вы можете найти файл robots.txt любого сайта, добавив /robots.txt после веб-адреса, например, так:

www.mywebsite.com/robots.txt

Вот как выглядит базовый, свежий файл robots.txt:

базовый файл robots.txt

Звездочка * после user-agent говорит краулерам, что файл robots.txt предназначен для всех ботов, посещающих сайт.

Косая черта / после "Disallow" говорит роботу не переходить на любые страницы сайта.

Вот пример файла robots.txt от Moz.

пример файла robots.txt от Moz.
Вы видите, что они сообщают краулерам, какие страницы краулить, используя user-agents и директивы. Я расскажу о них чуть позже.

Почему важен файл Robots.txt?

Я не могу сказать, сколько клиентов обращаются ко мне после миграции сайта или запуска нового сайта и спрашивают меня: Почему мой сайт не ранжируется после месяцев работы?

Я бы сказал, что 60% причина в том, что файл robots.txt не был правильно обновлен.

Это означает, что ваш файл robots.txt по-прежнему выглядит так:

Пример файла robots.txt

Это блокирует все веб-краулеры, посещающие ваш сайт.

Еще одна причина, по которой файл robots.txt важен, заключается в том, что у Google есть такая штука, как бюджет краула.

Google говорит:

«Googlebot разработан так, чтобы быть хорошим гражданином веба. Краулинг – его главный приоритет, при этом он обеспечивает нормальное взаимодействие с пользователями, посещающими сайт. Мы называем это «лимитом скорости краула», который ограничивает максимальную скорость получения данных для данного сайта.

Проще говоря, это представляет собой количество одновременных параллельных соединений, которые Googlebot может использовать для краулинга сайта, а также время ожидания между получениями данных».

Так что, если у вас большой сайт с низкокачественными страницами, которые вы не хотите, чтобы Google краулил, вы можете сказать Google «Запретить» их в вашем файле robots.txt.

Это освободит ваш бюджет краула, чтобы он краулил только высококачественные страницы, которые вы хотите, чтобы Google ранжировал для вас.

На данный момент нет четких и строгих правил для файлов robots.txt... пока.

Google объявил в июле 2019 года о предложении начать внедрение определенных стандартов, но пока что я придерживаюсь лучших практик, которые использовала в течение последних нескольких лет.

Основы Robots.txt

Как использовать Robots.txt

Использование robots.txt крайне важно для успешного SEO.

Однако непонимание его работы может заставить вас почесать затылок, пытаясь понять, почему вы не ранжируетесь.

Поисковые системы будут краулить и индексировать ваш сайт на основе того, что вы сообщите им в файле robots.txt с использованием директив и выражений.

Ниже приведены распространенные директивы robots.txt, которые вам следует знать:

  • User-agent: * — Это первая строка в вашем файле robots.txt, чтобы объяснить краулерам правила того, что вы хотите, чтобы они краулили на вашем сайте. Звездочка информирует всех пауков.
  • User-agent: Googlebot — Это говорит только о том, что вы хотите, чтобы краулер Google краулил.
  • Disallow: / — Это говорит всем краулерам не краулировать ваш весь сайт.
  • Disallow: — Это говорит всем краулерам краулировать ваш весь сайт.
  • Disallow: /staging/ — Это говорит всем краулерам игнорировать ваш тестовый сайт.
  • Disallow: /ebooks)) { document.addEventListener("mousemove", resizeIframe, false); } }, false); document.addEventListener("mouseup", function(){ if (isIframeActive()) { document.removeEventListener("mousemove", resizeIframe, false); } }, false); barEl.onclick = function (e) { var target = e.target, block = findAncestor(target, blockClass); if (block && !block.classList.contains(titleClass) && !block.classList.contains(ignoreClickClass) && e.which !== 2 && !e.ctrlKey ) { while (target !== this) { if (target.href) { removeActiveBlocksCls(); block.classList.add(blockActiveClass); showIframe(target.href); } target = target.parentNode; } e.preventDefault(); } }; toggleEl.onclick = togglePosition; } function findAncestor(el, cls) { while ((el = el.parentElement) && !el.classList.contains(cls)) ; return el; } function renderAjaxRequests() { var requestCounter = document.getElementsByClassName('yii-debug-toolbar__ajax_counter'); if (!requestCounter.length) { return; } var ajaxToolbarPanel = document.querySelector('.yii-debug-toolbar__ajax'); var tbodies = document.getElementsByClassName('yii-debug-toolbar__ajax_requests'); var state = 'ok'; if (tbodies.length) { var tbody = tbodies[0]; var rows = document.createDocumentFragment(); if (requestStack.length) { var firstItem = requestStack.length > 20 ? requestStack.length - 20 : 0; for (var i = firstItem; i < requestStack.length; i++) { var request = requestStack[i]; var row = document.createElement('tr'); rows.appendChild(row); var methodCell = document.createElement('td'); methodCell.innerHTML = request.method; row.appendChild(methodCell); var statusCodeCell = document.createElement('td'); var statusCode = document.createElement('span'); if (request.statusCode < 300) { statusCode.setAttribute('class', 'yii-debug-toolbar__ajax_request_status yii-debug-toolbar__label_success'); } else if (request.statusCode < 400) { statusCode.setAttribute('class', 'yii-debug-toolbar__ajax_request_status yii-debug-toolbar__label_warning'); } else { statusCode.setAttribute('class', 'yii-debug-toolbar__ajax_request_status yii-debug-toolbar__label_error'); } statusCode.textContent = request.statusCode || '-'; statusCodeCell.appendChild(statusCode); row.appendChild(statusCodeCell); var pathCell = document.createElement('td'); pathCell.className = 'yii-debug-toolbar__ajax_request_url'; pathCell.innerHTML = request.url; pathCell.setAttribute('title', request.url); row.appendChild(pathCell); var durationCell = document.createElement('td'); durationCell.className = 'yii-debug-toolbar__ajax_request_duration'; if (request.duration) { durationCell.innerText = request.duration + " ms"; } else { durationCell.innerText = '-'; } row.appendChild(durationCell); row.appendChild(document.createTextNode(' ')); var profilerCell = document.createElement('td'); if (request.profilerUrl) { var profilerLink = document.createElement('a'); profilerLink.setAttribute('href', request.profilerUrl); profilerLink.innerText = request.profile; profilerCell.appendChild(profilerLink); } else { profilerCell.innerText = 'n/a'; } row.appendChild(profilerCell); if (request.error) { if (state !== "loading" && i > requestStack.length - 4) { state = 'error'; } } else if (request.loading) { state = 'loading' } row.className = 'yii-debug-toolbar__ajax_request'; } while (tbody.firstChild) { tbody.removeChild(tbody.firstChild); } tbody.appendChild(rows); } ajaxToolbarPanel.style.display = 'block'; } requestCounter[0].innerText = requestStack.length; var className = 'yii-debug-toolbar__label yii-debug-toolbar__ajax_counter'; if (state === 'ok') { className += ' yii-debug-toolbar__label_success'; } else if (state === 'error') { className += ' yii-debug-toolbar__label_error'; } requestCounter[0].className = className; } function shouldTrackRequest(requestUrl) { if (!toolbarEl) { return false; } var a = document.createElement('a'); a.href = requestUrl; var skipAjaxRequestUrls = JSON.parse(toolbarEl.getAttribute('data-skip-urls')); if (Array.isArray(skipAjaxRequestUrls) && skipAjaxRequestUrls.length && skipAjaxRequestUrls.includes(requestUrl)) { return false; } return a.host === location.host; } var proxied = XMLHttpRequest.prototype.open; XMLHttpRequest.prototype.open = function (method, url, async, user, pass) { var self = this; if (shouldTrackRequest(url)) { var stackElement = { loading: true, error: false, url: url, method: method, start: new Date() }; requestStack.push(stackElement); this.addEventListener('readystatechange', function () { if (self.readyState === 4) { stackElement.duration = self.getResponseHeader('X-Debug-Duration') || new Date() - stackElement.start; stackElement.loading = false; stackElement.statusCode = self.status; stackElement.error = self.status < 200 || self.status >= 400; stackElement.profile = self.getResponseHeader('X-Debug-Tag'); stackElement.profilerUrl = self.getResponseHeader('X-Debug-Link'); renderAjaxRequests(); } }, false); renderAjaxRequests(); } proxied.apply(this, Array.prototype.slice.call(arguments)); }; if (window.fetch) { var originalFetch = window.fetch; window.fetch = function (input, init) { var method; var url; if (typeof input === 'string') { method = (init && init.method) || 'GET'; url = input; } else if (window.URL && input instanceof URL) { method = (init && init.method) || 'GET'; url = input.href; } else if (window.Request && input instanceof Request) { method = input.method; url = input.url; } var promise = originalFetch(input, init); if (shouldTrackRequest(url)) { var stackElement = { loading: true, error: false, url: url, method: method, start: new Date() }; requestStack.push(stackElement); promise.then(function (response) { stackElement.duration = response.headers.get('X-Debug-Duration') || new Date() - stackElement.start; stackElement.loading = false; stackElement.statusCode = response.status; stackElement.error = response.status < 200 || response.status >= 400; stackElement.profile = response.headers.get('X-Debug-Tag'); stackElement.profilerUrl = response.headers.get('X-Debug-Link'); renderAjaxRequests(); return response; }).catch(function (error) { stackElement.loading = false; stackElement.error = true; renderAjaxRequests(); throw error; }); renderAjaxRequests(); } return promise; }; } })();