Nginx PHP API CORS - PullRequest
       15

Nginx PHP API CORS

0 голосов
/ 24 сентября 2018

Я разрабатываю SPA с VueJS, который должен работать с PHP API / Nginx в удаленном домене.Конечно, я столкнулся с проблемой CORS.

Вот последний файл конфигурации Nginx:

 location / {

                add_header 'Access-Control-Allow-Origin' '*';
                add_header 'Access-Control-Allow-Credentials' 'true';
                add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE, HEAD';
                add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,some_my_tokens';

            if ($request_method = 'OPTIONS') {
                add_header 'Access-Control-Max-Age' '1728000';
                add_header 'Access-Control-Allow-Credentials' 'true';
                add_header 'Access-Control-Allow-Headers' 'Origin,Content-Type,Accept,Authorization,some_my_tokens';
                add_header 'Content-Type' 'text/plain; charset=UTF-8';
                add_header 'Content-Length' '0';
                return 204;
            }

            try_files $uri $uri/ /index.php?$args;

        }

Я все еще получаю ошибки "Нет заголовка 'Access-Control-Allow-Origin' на запрошенном ресурсе.http://remote_host:8080', следовательно, доступ запрещен. ".

Пожалуйста, помогите.

Ответы [ 3 ]

0 голосов
/ 24 сентября 2018

Причина, по которой он говорит No 'Access-Control-Allow-Origin' header is present on the requested resource, заключается в том, что .....

ждите этого ....

заголовок 'Access-Control-Allow-Origin' отсутствуетзапрашиваемый ресурс.

У вас есть эта директива в вашем блоке местоположения:

add_header 'Access-Control-Allow-Origin' '*';

Но тогда у вас есть условие if для OPTIONS запросов, и на этом уровне вы не 'не может иметь заголовок Access-Control-Allow-Origin.

С документы

Может быть несколько директив add_header.Эти директивы наследуются от предыдущего уровня тогда и только тогда, когда на текущем уровне не определены директивы add_header.

Таким образом, в предварительном просмотре OPTIONS будет отсутствовать заголовок.

0 голосов
/ 14 августа 2019

Я бы предложил использовать more_set_headers в nginx.conf вместо add_header, например:

   location / {

            more_set_headers 'Access-Control-Allow-Origin' '*';
            more_set_headers 'Access-Control-Allow-Credentials' 'true';
            more_set_headers 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE, HEAD';
            more_set_headers 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,some_my_tokens';

        if ($request_method = 'OPTIONS') {
            more_set_headers 'Access-Control-Max-Age' '1728000';
            more_set_headers 'Access-Control-Allow-Credentials' 'true';
            more_set_headers 'Access-Control-Allow-Headers' 'Origin,Content-Type,Accept,Authorization,some_my_tokens';
            more_set_headers 'Content-Type' 'text/plain; charset=UTF-8';
            more_set_headers 'Content-Length' '0';
            return 204;
        }

        try_files $uri $uri/ /index.php?$args;

    }

Директива more_set_headers является частью HttpHeadersMoreМодуль , который входит в состав nginx-extras nginx, вы можете установить его на Ubuntu 16, выполнив:

sudo apt-get install nginx-extras

0 голосов
/ 24 сентября 2018

Добавьте приведенный ниже код в ваш index.php

if (isset($_SERVER['HTTP_ORIGIN'])) {
    header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
    header('Access-Control-Allow-Credentials: true');
    header('Access-Control-Max-Age: 86400'); // cache for 1 day

}
// Access-Control headers are received during OPTIONS requests
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD'])) {
        header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
    }
    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS'])) {
        header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");
    }
    exit(0);
}
...