Проблема CORS в codeigniter 4: ответ на предполетный запрос не проходит проверку контроля доступа

Я делаю api с Codeigniter 4 для приложения реакции. В почтальоне все работает нормально, но когда я делаю запросы с помощью axios (также пробовал получить), он получает ошибку CORS

Доступ к XMLHttpRequest по адресу 'http://localhost:8080/testpost' from origin 'http://localhost:3000 'заблокирован политикой CORS: ответ на предварительный запрос не проходит проверку контроля доступа: No' Access-Control Заголовок -Allow-Origin 'присутствует в запрошенном ресурсе.

Я попытался добавить заголовки в базовый контроллер:

header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Methods: POST,GET, OPTIONS");
header("Access-Control-Allow-Headers: *");

Теперь он отлично работает с запросами без тела JSON, но когда я отправляю тело json, возникает такая же ошибка.

axios.post("http://localhost:8080/testpost", { data: "test" })
    .then((response) => {
        console.log(response);
    })
    .catch((err) => {
        console.log("error!!!");
    });
// Routes.php
$routes->post('/testpost', 'Home::testPost');
// Home Controller
public function testPost()
{
    return $this->response->setJSON('test response');
}

Спасибо за вашу помощь


person eminsh    schedule 21.05.2020    source источник


Ответы (1)


Попробуйте установить заголовки ответов Apache и метод перенаправления на .htaccess в корне каталога www/public, например:

#Redirect for CORS Preflight request
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ $1 [R=200,L]
#Set headers to access CORS Requests / allowing localhost only
Header always add Access-Control-Allow-Origin "*"
Header always add Access-Control-Allow-Headers "origin, x-requested-with, content-type"
Header always add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"

ПРИМЕЧАНИЕ: будьте осторожны, добавляя Header always add Access-Control-Allow-Origin "*" в свой .htaccess, "*" откройте двери для злоумышленников, замените * своим доменом или subdumain!

person Akash prajapati    schedule 21.05.2020
comment
Есть ли проблема с этим решением? - person Akash prajapati; 21.05.2020
comment
Спасибо за ответ, к сожалению, не работает. Он делает то же самое, что и установка заголовков в PHP. - person eminsh; 21.05.2020
comment
Если это будет сделано, не могли бы вы пометить это как «Готово»? - person Akash prajapati; 21.05.2020
comment
Спасибо, теперь работает. Я надеялся, что для этого понадобится PHP. но пока я думаю, что это лучший способ. - person eminsh; 21.05.2020
comment
Как точно вы устанавливаете заголовки ответов Apache? httpd.conf? - person ron_g; 21.09.2020
comment
@ron_g, вы должны добавить эти строки в .htaccess файл в вашем корневом общедоступном пути. и будьте осторожны, чтобы не дублировать первые 3 строки. - person Mamrezo; 23.02.2021
comment
Добавил это в mode_rewrite.c, заработало. Я использовал только Header always add Access-Control-Allow-Headers "content-type", потому что я не отправляю никаких заголовков. Других изменений в интерфейсе нет. - person Linga; 03.06.2021