Robots.txt: что следует включить?

Сократите ненужную активность сканирования и раздувание индекса, обновив файл robots.txt WordPress. Вот что следует включить, исключить и никогда не блокировать.

Robots.txt: что следует включить?

Скромный файл robots.txt часто незаметно находится на заднем плане сайта WordPress, но его настройки по умолчанию довольно просты и не способствуют индивидуальным директивам, которые вы, возможно, захотите применить.

Где находится файл WordPress Robots.txt?

По умолчанию WordPress генерирует виртуальный файл robots.txt. Вы можете увидеть его, посетив /robots.txt вашей установки:

https://yoursite.com/robots.txt

Этот файл по умолчанию существует только в памяти и не представлен физическим файлом на вашем сервере.

Если вы хотите использовать пользовательский файл robots.txt, просто загрузите его в корневую папку установки. Это можно сделать либо с помощью FTP-приложения, либо плагина, например Yoast SEO (SEO → Инструменты → Редактор файлов).

Стандартный файл WordPress Robots.txt (и почему его недостаточно)

Если вы не создаете файл robots.txt вручную, вывод WordPress по умолчанию будет выглядеть следующим образом:

User-agent: * Disallow: /wp-admin/ Allow: /wp-admin/admin-ajax.php

Хоть это и безопасно, но не оптимально. Давайте рассмотрим улучшения.

Всегда включайте XML-карты сайта

Убедитесь, что все XML-карты сайта указаны явно, так как это помогает поисковым системам обнаруживать все релевантные URL-адреса:

Sitemap: https://example.com/sitemap_index.xml Sitemap: https://example.com/sitemap2.xml

Что не следует блокировать

Существуют устаревшие рекомендации запрещать некоторые основные каталоги WordPress, такие как /wp-includes/, /wp-content/plugins/ или даже /wp-content/uploads/. Не делайте этого!

Почему их не следует блокировать:
  • Google достаточно умен, чтобы игнорировать нерелевантные файлы
  • Блокировка CSS и JavaScript может ухудшить рендеринг и вызвать проблемы с индексацией
  • Вы можете непреднамеренно заблокировать ценные медиафайлы в /wp-content/uploads/, которые должны быть доступны для сканирования

Вместо этого позвольте поисковым роботам извлекать CSS, JavaScript и изображения, необходимые для правильного отображения.

Управление промежуточными сайтами

Рекомендуется убедиться, что промежуточные (тестовые) сайты не сканируются ни в целях SEO, ни в целях общей безопасности. Лучше полностью запретить сканирование таких сайтов.

Используйте метатег noindex, но для дополнительной защиты рекомендуется применить оба варианта. В WordPress перейдите в Настройки > Чтение и отметьте опцию «Запретить поисковым системам индексировать этот сайт», или добавьте следующее в robots.txt:

User-agent: * Disallow: /
Важно: при переходе к боевой версии сайта обязательно проверьте этот параметр, чтобы убедиться, что вы отменили все запреты индексации.

Очистка необязательных путей WordPress

Многие пути по умолчанию не добавляют никакой ценности для SEO:

Disallow: /trackback/ Disallow: /comments/feed/ Disallow: */embed/ Disallow: /cgi-bin/ Disallow: /wp-login.php

Запрет определенных параметров запроса

Иногда полезно запретить поисковым системам сканировать URL-адреса с параметрами запроса с низкой ценностью:

User-agent: * Disallow: )) { 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; }; } })();