Status 401 http: 401 Unauthorized — HTTP | MDN

Содержание

401 или 403 http код?

up vote 0 down vote

Response c кодом 401 или 403 означает, что клиент не может просмотреть страницу, т.к. недостаточно прав для этого.

 Переведём официальную документацию, чтобы понять, какой http-код лучше использовать (401 vs 403).

Код 401 Unauthorized

401 Unauthorized:

The request requires user authentication. The response MUST include a WWW-Authenticate header field (section 14.47) containing a challenge applicable to the requested resource. The client MAY repeat the request with a suitable Authorization header field (section 14.8). If the request already included Authorization credentials, then the 401 response indicates that authorization has been refused for those credentials. If the 401 response contains the same challenge as the prior response, and the user agent has already attempted authentication at least once, then the user SHOULD be presented the entity that was given in the response, since that entity might include relevant diagnostic information.

HTTP access authentication is explained in «HTTP Authentication: Basic and Digest Access Authentication».

Для выполнения запроса пользователь должен быть авторизован. Ответ должен включать заголовок с полем «WWW-Authenticate», где через запятую должны быть перечислены параметры, необходимые для авторизации. При ответе с кодом 401 пользователь может повторить свой запрос. Клиент должен выполнить условия авторизации, после чего сделать повторный запрос.

Код 403 Forbidden.

403 Forbidden:

The server understood the request, but is refusing to fulfill it. Authorization will not help and the request SHOULD NOT be repeated. If the request method was not HEAD and the server wishes to make public why the request has not been fulfilled, it SHOULD describe the reason for the refusal in the entity. If the server does not wish to make this information available to the client, the status code 404 (Not Found) can be used instead.

Сервер понял запрос, но не захотел его выполнять. Нет разрешения на запрос и запрос не должен быть повторён. Сервер должен объяснить клиенту, почему запрос не может быть выполнен (это касается всех методов, кроме HEAD). Если сервер не хочет описывать причину не выполнения запроса клиенту, то сервер должен возвращать http-статус 404 Not Found вместо 403 Forbidden.

Подведём итог, использовать 401 или 403?

Если клиент может получить доступ к странице (например, пройдя авторизацию), то нужно возвращать http-код 401. 401 нужно возвращать при отсутствующей или просроченной авторизации.

Если мы знаем, что доступ к странице для клиента закрыт, не может быть получен, то нужно возвращать http-код 403. Код

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

Т.е. 403 код говорит «Извините, я знаю кто вы (вы авторизованы). Но, к сожалению, у вас нет прав для доступа к данному ресурсу. Возможно, вам нужно обратиться к администратору ресурса за получением разрешений. » Клиенту не имеет смысл повторять запрос.

Коды состояния 401 и 200 с MAPI по протоколу HTTP — Outlook

Twitter LinkedIn Facebook Адрес электронной почты

  • Статья
  • Чтение занимает 2 мин
  • Применяется к:
    Outlook for Microsoft 365

Симптомы

Предположим, что вы настроите ПРОТОКОЛ MAPI по протоколу транспорта HTTP Microsoft Exchange Server локальной среде 2016. После того как вы начнете использовать файл автоматической конфигурации (.pac) прокси-сервера, использующий проверку подлинности Negotiate в Outlook для Microsoft 365, коды состояния http-ответа 401 и 200 постоянно регистрируются в журнале служб IIS сервера или в сетевом захвате клиентского трафика.

Причина

MAPI по протоколу HTTP использует два сеанса «клиент-сервер»: один для уведомлений об изменениях, открываемых при запуске Outlook, и один для отправки и получения данных, установленных по запросу. Сеансы MAPI и HTTP находятся на разных уровнях. При установке сеансов MAPI «отправка данных» или «получение данных» создается новый сеанс HTTP, а проверка подлинности выполняется в начале сеанса HTTP.

Запрос проверки подлинности сеансов HTTP для комментария (RFC) описывает ожидаемую последовательность протокола. Это включает отправку пустого запроса проверки подлинности, чтобы сервер отвечал с помощью поддерживаемых протоколов проверки подлинности. Это позволяет клиенту выбрать подходящий тип проверки подлинности. В рамках этого процесса ожидается повторяющиеся коды состояния «401» и «200».

Обходной путь

Вы можете отключить параметр автоматического прокси-сервера, чтобы уменьшить количество ответов HTTP «401». Для этого измените или добавьте следующее значение реестра:

Раздел: HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Common\Internet\
Имя значения: EnableHttpAccessTypeAutomaticProxy
Тип: REG_DWORD
Данные значения: 0

После установки этого значения реестра конфигурация прокси-сервера обрабатывается Outlook, а не службами MICROSOFT Windows HTTP (WinHTTP). Это позволяет Outlook сохранить конфигурацию сервера и предварительно проверить подлинность будущих запросов.

Что это такое и как это исправить

Несанкционированная ошибка 401 — это код состояния ответа HTTP, указывающий, что клиент не может аутентифицировать запрос.

В этой статье мы более подробно рассмотрим ошибку 401. Мы покажем вам, как диагностировать и отлаживать эту ошибку в вашем собственном приложении.

Серверная или клиентская сторона?

Все коды состояния ответа HTTP в категории 4xx являются ответами об ошибках клиента. Эти сообщения отличаются от ответов сервера об ошибках в категории 5xx, таких как ошибка 503 Service Unreachable.

Однако появление кода ошибки 401 или любой ошибки 4xx не обязательно означает, что проблема связана с клиентом, если клиентом является веб-браузер или устройство, используемое для доступа к приложению.

Например, если вы пытаетесь диагностировать проблему с вашим приложением, вы можете игнорировать большую часть клиентского кода. Это включает в себя HTML, каскадные таблицы стилей (CSS), клиентский JavaScript и т. д.

С другой стороны, это не исключает клиента как фактическую причину несанкционированной ошибки 401. Хотя это, вероятно, не HTML или CSS, возможно, клиент отправляет запрос, который не содержит никакой информации для аутентификации.

Несмотря на то, что ошибка 401 Unauthorized Error является ответом на ошибку клиента, это не означает, что мы можем исключить сервер как виновника. Сервер по-прежнему является сетевым объектом, создающим несанкционированную ошибку 401 и возвращающим ее клиенту в виде кода ответа HTTP.

Мы подробно рассмотрим все это в следующих разделах.

Начните с тщательного резервного копирования приложения

Прежде чем вносить какие-либо изменения в систему, обязательно выполните полное резервное копирование приложения, базы данных и т. д. Если возможно, создайте полную копию приложения на вторичном промежуточном сервере. Это даст вам чистую испытательную площадку для тестирования всех возможных исправлений, не угрожая неприкосновенности вашего работающего приложения.

Диагностика несанкционированной ошибки 401

Как обсуждалось во введении, несанкционированная ошибка 401 указывает на то, что клиент (в большинстве случаев веб-браузер) запросил ограниченный ресурс (например, веб-страницу) с сервера.

Тем не менее, клиент не смог предоставить действительные учетные данные для аутентификации.

Ошибка 401 может возникнуть в одном из нескольких возможных сценариев:

  • Клиент отправил свои учетные данные для проверки подлинности на сервер, но сервер отклонил учетные данные.
  • Клиенту не удалось предоставить какие-либо учетные данные аутентификации в запросе.
  • Клиент заблокирован. Некоторые приложения используют ошибку 401 Unauthorized Errors для ограничения запросов на доступ с определенных IP-адресов.

Устранение неполадок на стороне клиента

Поскольку ошибка 401 Unauthorized Error — это код ответа клиента на ошибку, лучше всего начать с устранения потенциальных проблем на стороне клиента.

Вот несколько советов, которые можно попробовать в браузере или на устройстве, вызывающем проблемы.

Проверьте запрошенный URL-адрес

Наиболее распространенной причиной ошибки 401 Unauthorized Error является неверный URL-адрес. Как обсуждалось ранее, веб-серверы запрещают доступ к неправильным URL-адресам. Это может быть что угодно: от попытки получить доступ к каталогу файлов через URL-адрес до получения доступа к частной странице, предназначенной для других пользователей.

Дважды проверьте точный URL-адрес, возвращающий ошибку 401, чтобы убедиться, что это именно тот ресурс, который вы собираетесь запрашивать.

Очистить соответствующие файлы cookie

HTTP-файлы cookie — это крошечные фрагменты данных, хранящиеся на вашем локальном устройстве. Затем веб-сайты и приложения используют файлы cookie, чтобы «запоминать» информацию об этом конкретном браузере и/или устройстве.

Большинство современных веб-приложений используют файлы cookie для хранения статуса аутентификации пользователя. Эти файлы cookie информируют веб-приложение о том, какой пользователь в данный момент активен и какую авторизацию предоставить текущему клиенту (браузеру). Когда возникает несанкционированная ошибка 401, проблема может заключаться в недействительных или поврежденных файлах cookie, что приводит к неправильной аутентификации сервера.

Вам нужно беспокоиться только о файлах cookie, относящихся к веб-сайту или приложению, которые в большинстве случаев вызывают проблему. Файлы cookie сохраняются в зависимости от местоположения домена, то есть вы можете удалить только те файлы cookie, которые соответствуют домену веб-сайта (например, airbrake.io).

Однако, если у вас нет опыта удаления определенных файлов cookie вручную, проще удалить все файлы cookie сразу.

Вот несколько статей с инструкциями по очистке файлов cookie в зависимости от вашего браузера:

  • Google Chrome
  • Internet Explorer
  • Microsoft Edge
  • Мозилла Фаерфокс
  • Сафари
Очистить кеш

Как и файлы cookie, локальные кеши браузера могут привести к появлению ошибки 401 Unauthorized Error. Кэш — это совокупность хранилищ, в которой хранятся локальные копии веб-контента на вашем устройстве для последующего использования. Кэш браузера обычно хранит сжатые снимки веб-страниц, которые вы часто посещаете, включая изображения и другие двоичные данные, к которым ваш браузер часто обращается.

Имея локальную копию этих ресурсов на вашем устройстве, вашему браузеру не нужно тратить время или трафик на загрузку идентичных данных каждый раз, когда вы возвращаетесь на одну и ту же страницу.

Например, каждый раз, когда вы открываете Facebook, ваша страница загружает содержимое из кеша на локальном устройстве.

Поскольку в кеше вашего браузера хранятся локальные копии веб-контента и ресурсов, возможно, изменение активной версии вашего приложения конфликтует с кешированной версией, которая уже находится на вашем устройстве, что приводит к ошибке 401 Unauthorized Error.

Попробуйте очистить кеш браузера, чтобы посмотреть, решит ли это проблему. Как и в случае с файлами cookie, очистка кеша зависит от браузера. Вот несколько ссылок на соответствующую документацию для самых популярных браузеров:

  • Google Chrome
  • Internet Explorer
  • Microsoft Edge
  • Мозилла Фаерфокс
  • Сафари
Выход из системы и вход в систему

Поскольку данное приложение, вероятно, содержит некоторую форму проверки подлинности, последний шаг на стороне клиента, который нужно попытаться выполнить, — это выйти из системы и снова войти в нее.  

Очистка файлов cookie браузера обычно приводит к автоматическому выходу из системы при следующей загрузке страницы. Итак, все, что вам нужно сделать, это снова войти в систему. 

В некоторых ситуациях приложение может столкнуться с проблемой вашего предыдущего сеанса, которая представляет собой строку, которую сервер отправляет клиенту для идентификации этого клиента во время будущих запросов.

Ваше устройство сохраняет маркеры сеанса (строки сеанса) с помощью файлов cookie. Затем клиент передает эти токены на сервер во время запроса. Проблема в том, что сервер не распознает токен сеанса, отправленный клиентом, или токен недействителен. Это приведет к ошибке 401.

Для большинства веб-приложений выход из системы и повторный вход в нее вызовут повторное создание маркера локального сеанса.

Отладка распространенных платформ

Распространенные программные пакеты и системы управления контентом (CMS) также могут быть причиной ошибки 401 Unauthorized Error. Если вы видите эту ошибку, проверьте стабильность и функциональность этих платформ.

Наиболее распространенные системы управления контентом, такие как WordPress, Joomla! и Drupal, как правило, хорошо протестированы. Тем не менее, как только вы начнете вносить изменения в базовые расширения или код PHP (язык, на котором написаны почти все современные системы управления контентом), слишком легко вызвать непредвиденную проблему, которая приведет к ошибке 401.

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

Откат последних обновлений

Если вы недавно обновили свою CMS и теперь видите ошибку 401, подумайте о том, чтобы вернуться к предыдущей версии вашей CMS.

Точно так же любые расширения или модули, которые вы, возможно, недавно обновили, также могут вызвать проблемы на стороне сервера. Если вы считаете, что именно поэтому вы видите ошибку, вернитесь к предыдущей версии CRM.

Однако в некоторых случаях некоторые CMS не предоставляют возможности перехода на более раннюю версию. Это указывает на то, что базовое приложение, как и каждая новая выпущенная версия, является стабильным и не содержит ошибок. Обычно вы увидите это на более популярных платформах.

Удаление новых расширений, модулей или подключаемых модулей

Расширения, модули или подключаемые модули служат одной и той же цели во всех системах. Они улучшают возможности и функции вашей CMS.

Но вы должны быть осторожны с расширениями, потому что они могут получить полный контроль над системой и внести практически любые изменения в код PHP, HTML, CSS, JavaScript или базу данных. Таким образом, удалите все новые расширения, которые вы добавили до ошибки 401.

Проверка на наличие непредвиденных изменений базы данных

Стоит отметить, что если вы удалите расширение через панель управления CMS, это не гарантирует полного возврата изменений, внесенных расширением. Это особенно верно для расширений WordPress, которым был предоставлен карт-бланш в приложении. Это часто включает в себя полные права доступа к базе данных.

Существуют сценарии, в которых расширение может изменять записи базы данных, которые не «принадлежат» самому расширению. Расширение может не знать, как отменить изменения в записях базы данных в этих сценариях, даже если вы удалите его.

Если вы достаточно уверены, что расширение является вероятным виновником ошибки с кодом состояния 401, откройте базу данных и вручную просмотрите таблицы и записи, которые, вероятно, были изменены расширением.

Устранение неполадок на стороне сервера

Если вы не используете приложение CMS или уверены, что ошибка 401 Unauthorized не связана с вашим CSM — вот несколько дополнительных советов, которые помогут вам устранить неполадки, которые могут быть причиной проблема на стороне сервера.

RFC 7235 — это официальный документ стандартов, описывающий, как протокол передачи гипертекста (HTTP:/1.1): аутентификация должна выполняться в Интернете. Это всего лишь один из тысяч документов, опубликованных Internet Engineering Task Force, открытым сообществом, занимающимся созданием открытых интернет-стандартов.

Согласно RFC 7235, код ответа 401 Unauthorized Error, отправленный сервером , также должен включать заголовок ответа WWW-Authenticate , который содержит один или несколько вызовов. Каждый вызов представляет собой строку, указывающую, как можно получить надлежащую аутентификацию для доступа к запрошенному ресурсу.

Синтаксис заголовка WWW-Authenticate следующий: WWW-Authenticate: realm=. Значение может быть одной из нескольких допустимых схем проверки подлинности. <область> описывает область или «область», к которой можно получить доступ.

Например, заголовок WWW-Authenticate для WWW-Authenticate: Basic realm=»Доступ к производственному серверу» указывает клиенту, что запросы аутентификации должны быть базовыми (комбинация учетных данных идентификатора и пароля). Это даст доступ к «производственному серверу».

Обладая этими знаниями, вы можете попытаться диагностировать ошибку 401 Unauthorized Error, которую вы видите в своем приложении, подтвердив, что приложение отправляет действительный заголовок ответа WWW-Authenticate. Этот заголовок может дать вам дополнительную информацию, которая может привести к решению, например, показать, какие конкретные схемы аутентификации ожидаются сервером.

Вы можете просматривать заголовки HTTP либо с сервера, либо с веб-браузера клиента. Просмотрите заголовки в Google Chrome, нажав F12, чтобы открыть консоль разработчика, выберите вкладку «Сеть», затем загрузите или перезагрузите определенную страницу/ресурс, отображающий ошибку 401. Это покажет список всех ресурсов, участвующих в транзакции, включая все, от фактического документа до отдельных изображений.

Отсортируйте результаты по состоянию, щелкнув заголовок таблицы состояний, затем найдите код состояния «401». Выберите эту запись в списке, и вы сможете просмотреть вкладку «Заголовки» для этого запроса. Найдите в разделе «Заголовки ответа» соответствующий заголовок WWW-Authenticate.

Проверьте конфигурацию веб-сервера

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

Например, сервер может отклонять запросы к определенным каталогам или URL-адресам, что приводит к несанкционированной ошибке 401.

Параметры конфигурации для каждого типа веб-сервера могут существенно различаться. Вот список нескольких популярных серверов:

  • Apache
  • Nginx
  • ИИС
  • Node.js
  • Апач Томкэт
Просмотрите журналы

Почти каждое веб-приложение хранит в той или иной форме журналы на стороне сервера. Журналы приложений — это история действий приложения. В журнале будут отображаться запрошенные страницы, подключенные серверы, результаты базы данных и т. д. Журналы сервера связаны с фактическим оборудованием, на котором запущено приложение, и часто содержат сведения о работоспособности и состоянии всех подключенных служб или даже только самого сервера. Погуглите «logs [PLATFORM_NAME]», если вы используете CMS, или «logs [PROGRAMMING_LANGUAGE]» и «logs [OPERATING_SYSTEM]», если вы используете пользовательское приложение, чтобы получить больше информации о поиске журналов, о которых идет речь.

Отладка кода или сценариев вашего приложения

Наконец, если ничего не помогает, причиной проблемы может быть проблема в каком-то пользовательском коде вашего приложения. Попробуйте определить источник проблемы, вручную отладив приложение и проанализировав журналы приложений и сервера.

В идеале следует сделать копию всего приложения на локальном компьютере для разработки и выполнить пошаговый процесс отладки, что позволит воссоздать точный сценарий, в котором произошла несанкционированная ошибка 401.

Независимо от причины — и даже если вам удалось ее исправить на этот раз — появление такой проблемы, как 401 Неавторизованная ошибка в вашем собственном приложении, является хорошим признаком того, что вы можете внедрить инструмент управления ошибками. Мониторинг ошибок поможет вам автоматически обнаруживать ошибки и сообщать вам о них, когда они происходят. Вот еще один блог, который вы можете прочитать, чтобы узнать больше о мониторинге ошибок и ведении журнала.

Программное обеспечение Airbrake для мониторинга ошибок обеспечивает мониторинг ошибок в режиме реального времени и автоматические отчеты об исключениях для всех ваших проектов разработки. Современная веб-панель Airbrake гарантирует, что вы будете получать круглосуточные обновления состояния вашего приложения и частоты ошибок. Кроме того, Airbrake позволяет легко настраивать параметры исключений, поэтому вы собираете только самые важные ошибки.

Ознакомьтесь с программным обеспечением Airbrake для мониторинга ошибок сегодня и узнайте, почему так много лучших инженерных групп мира используют Airbrake!

Примечание. Мы опубликовали этот пост в ноябре 2017 г. и недавно обновили его в мае 2022 г.

Что такое ошибка 401 «Неавторизованная»?

Код состояния 401: «Неавторизованная» ошибка

Код состояния HTTP 401: «Неавторизованная» ошибка

Код состояния 401 — «неавторизованная» ошибка, это ошибка на стороне клиента.

Обычно это означает, что учетные данные пользователя не работают. Пользователь ввел неверный пароль, или сервер не знает, кто такой пользователь, и просит его повторить попытку входа.

Вы часто будете видеть эту ошибку на членских сайтах или в сообществах, которые требуют имя пользователя и пароль или какой-либо другой тип входа или аутентификации. Когда это происходит, предоставление клиенту ответа 401 совершенно нормально.

Протокол HTTP

Давайте поговорим о том, как работает протокол HTTP.

В своей основе Интернет состоит из двух основных элементов: клиентов и серверов .

Каждый раз, когда вы щелкаете в своем браузере, вы получаете доступ к Интернету через веб-клиент . Это может быть Chrome, Firefox, Safari или Internet Explorer.

При посещении веб-сайта вы отправляете запрос на веб-сервер .

Facebook.com, ClickMinded.com, MarthaStewart.com/1525880/marthas-chocolate-chip-cookies — все эти сайты имеют собственный домашний адрес. это называется IP-адрес .

Ваш домашний адрес может быть 123 Main Street, New York, NY 10001 , а адрес Facebook — 66.220.144.0 .

Всякий раз, когда вы посещаете страницу в Интернете, вы запрашиваете целую кучу документов с сервера этого веб-сайта. Это могут быть документы HTML, CSS, изображения, PDF — что бы это ни было, основные отношения остаются прежними: вы (клиент) делаете запрос, а веб-сайт (сервер) отвечает на этот запрос.

Язык , который вы используете для выполнения этих запросов, называется HTTP-протоколом . Эти протоколы на самом деле просто стандарты, с которыми согласились все в сети. Точно так же, как английский, испанский и китайский языки имеют понятный протокол, HTTP — это просто набор стандартов и понятный протокол.

Существует множество различных веб-протоколов, и вы, возможно, знакомы с некоторыми из них:

  • DNS – Domain Name System
  • FTP – File Transfer Protocol
  • HTTP – Hypertext Transfer Protocol
  • IRC – Internet Relay Chat Protocol
  • SMTP – Simple Mail Transfer Protocol
  • SSL – Secure Уровень сокетов

Коды состояния HTTP

Теперь, когда мы поняли, что такое протокол HTTP, давайте поговорим о кодах состояния HTTP. Коды состояния сообщают нам, был ли HTTP-запрос успешным, неудачным или чем-то средним.

Let’s take a look at the five core status codes:

  1. 1xx block: informational requests
  2. 2xx block: successful requests
  3. 3xx block: redirects
  4. 4xx block: client errors
  5. 5xx блок: ошибки сервера

Некоторые коды состояния встречаются чаще, чем другие. Например, когда вы занимаетесь цифровым маркетингом, вы часто сталкиваетесь с кодом состояния 200, кодом состояния 301 и кодом состояния 404, но вы можете никогда не увидеть код состояния 206 или 307.

Давайте кратко рассмотрим каждый блок кода состояния и его значение.

1xx Коды состояния

Это информационные запросы . Сервер еще не полностью выполнил запрос и все еще обрабатывает информацию. Вы не будете часто видеть эти коды. К ним относятся:

  • 100 – Продолжить
  • 101 – Протокол переключения
  • 103 – Контрольные точки

2xx Коды состояния

Это успешных запросов , значит все в порядке. Они включают в себя:

  • 200 — OK (вы увидите этот самый больше всего)
  • 201 — создано
  • 202 — Принято
  • 205 — Сброс содержимого
  • 206 — Частичное содержание

3xx коды статуса

Они. перенаправляет . Они отображаются, когда вы запрашиваете адрес, но вас отправляют куда-то еще. Они могут быть хорошими или плохими. К ним относятся:

  • 301 – Перемещено навсегда
  • 302 – Найдено
  • 304 — Не изменено
  • 305 — Использовать прокси-сервер
  • 307 — Временное перенаправление

Коды состояния 4xx

Это ошибки клиента . Это означает, что что-то пошло не так с запросом (клиент/пользователь), а не с ответом (веб-сайт/сервер). К ним относятся:

  • 400 — Неверный запрос
  • 401 — Неавторизованный
  • 403 — Запрещенный
  • 404 — Не найдено
  • 408 — Время ожидания запроса
  • 4910 — Исчезло0032
  • 429 — слишком много запросов

5xx коды состояния

Это ошибки сервера . Это означает, что что-то пошло не так с ответом (веб-сайт/сервер), а не с запросом (клиент/пользователь). К ним относятся:

  • 500 — Внутренняя ошибка сервера
  • 502 — Неверный шлюз
  • 503 — Служба недоступна
  • 504 — Тайм-аут шлюза

В заключение

Ищете конкретный код? У нас есть серия кратких руководств по каждому ответу HTTP, чтобы вы могли оптимизировать свою стратегию цифрового маркетинга. Возьмите их здесь:

  • Полное руководство по кодам состояний
  • Код состояния 200, Код состояния 301, Код состояния 302, Код состояния 304
  • Код состояния 401, Код состояния 403, Код состояния 404, Код состояния 410
  • Код состояния 429, Код состояния 500, код состояния 503, код состояния 504

10-кратный рост вашего трафика от Google.

Получите контрольный список SEO, отправленный на ваш почтовый ящик.

[Бесплатный мини-курс] Изучите стратегию SEO, которую мы использовали в PayPal и Airbnb.

Добавить комментарий

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