Вопрос или проблема
Я использую ReactJs с WordPress. WordPress запущен на порту 8888
локального хоста, а приложение React работает на порту 3000
. Когда я изменяю URL сайта WordPress (в настройках->общие) на localhost:300
, я получаю следующую ошибку,
Доступ к XMLHttpRequest по адресу
‘http://localhost:8888/bolb/wp-json/wp/v2/categories‘ из источника
‘http://localhost:3000‘ был заблокирован политикой CORS: Отсутствует
заголовок ‘Access-Control-Allow-Origin’ в запрашиваемом ресурсе.
Это также не работает в Postman. Но всё работает, если я использую тот же URL (http://localhost:8888/bolb) в качестве URL сайта.
просто добавьте это в ваш файл function.php
add_filter( 'allowed_http_origin', '__return_true' );
Ответ или решение
Если вы столкнулись с ошибкой отсутствия заголовка ‘Access-Control-Allow-Origin’ при попытке вызова API в вашей среде разработки WordPress и ReactJS, то это, скорее всего, связано с проблемами CORS (Cross-Origin Resource Sharing). В данном случае, ваша установка WordPress работает на localhost с портом 8888, а ваше React-приложение запускается на порте 3000. Эта разница в происхождении и вызывает проблему CORS, поскольку браузеры блокируют запросы между разными доменами, портами или протоколами по умолчанию для защиты данных.
Что такое CORS и почему это важно?
CORS — это механизм, который использует заголовки HTTP, чтобы обнаруживать разрешенные домены, с которых может быть осуществлён доступ к ресурсам на сервере. Если запрос отправляется с домена, который не содержится в этом списке, запрос будет заблокирован браузером.
Как решить проблему CORS в вашей ситуации?
- Настройка WordPress для поддержки CORS:
- Убедитесь, что в WordPress ваш API поддерживает необходимые заголовки. Включите фильтр в вашем файле
functions.php
, чтобы разрешить CORS-запросы.
- Убедитесь, что в WordPress ваш API поддерживает необходимые заголовки. Включите фильтр в вашем файле
add_filter('allowed_http_origin', '__return_true');
add_action('rest_api_init', function() {
remove_filter('rest_pre_serve_request', 'rest_send_cors_headers');
add_filter('rest_pre_serve_request', function ($value) {
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
header('Access-Control-Allow-Headers: Authorization, Content-Type, X-WP-Nonce');
return $value;
});
}, 15);
- Проверка заголовков сервера:
- Убедитесь, что ваш сервер Apache или Nginx настроен правильно. Для Apache, это может быть сделано с использованием файла
.htaccess
:
- Убедитесь, что ваш сервер Apache или Nginx настроен правильно. Для Apache, это может быть сделано с использованием файла
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "*"
</IfModule>
Для Nginx, добавьте следующий код в конфиг вашего сайта:
add_header 'Access-Control-Allow-Origin' '*';
- Настройка безопасности:
- Если ваше приложение будет работать в продакшене, не используйте универсальное разрешение (
*
), так как это может создать уязвимости. Лучше специфицировать конкретные домены, которым доверяете:
- Если ваше приложение будет работать в продакшене, не используйте универсальное разрешение (
Header set Access-Control-Allow-Origin "http://localhost:3000"
Заключение
Настройка CORS в вашей среде разработки является необходимым шагом для обеспечения безопасного и эффективного взаимодействия между вашим frontend (ReactJS) и backend (WordPress) частями приложения. Следуя вышеуказанным шагам и убедившись в корректности конфигураций, вы сможете устранить ошибку и продолжить разработку своего приложения без преград.