как заставить NGINX обрабатывать заголовки CORS, когда PHP генерирует ответ - PullRequest
0 голосов
/ 28 июня 2019

В идеале я бы хотел выполнить эту настройку:

- NGINX обрабатывает CORS

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

Но, если я помещу всю обработку CORS в NGINX, она будет работать только , если мои PHP-скрипты не запускаются.Если они запускаются, заголовки CORS, определенные в NGINX, не будут сгенерированы.

Чтобы исправить это, чтобы получить заголовки CORS, у меня есть эта настройка.

... / php.conf

index index.php index.html index.htm;

location ~ \.(php|phar)(/.*)?$ {

 fastcgi_split_path_info ^(.+\.(?:php|phar))(/.*)$;

 fastcgi_intercept_errors on;
 fastcgi_index  index.php;
 include        fastcgi_params;
 fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
 fastcgi_param  PATH_INFO $fastcgi_path_info;
 fastcgi_pass   php-fpm;

 # CORS handling for OPTIONS

 if ($request_method = 'OPTIONS') {
    add_header 'Access-Control-Allow-Origin' '*';
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, HEAD';
    add_header 'Access-Control-Allow-Headers' 'Authorization, Origin, X-Requested-With, Content-Type, Accept';
    add_header 'Access-Control-Max-Age' 1728000;
    return 204;
 }
}

и

Мне пришлось поместить генерацию заголовка (те же заголовки, что и выше) в мой API, чтобы обработать их эмиттанс с моим ответом API PHP.(ответы на GET и POST):

    $status_header = 'HTTP/1.1 ' . "$status $statusMessage";
    header($status_header);
    header('Content-type: ' . $content_type);
    header('Access-Control-Allow-Origin: *');
    header('Access-Control-Allow-Methods: GET, POST, OPTIONS, HEAD');
    header('Access-Control-Allow-Headers: Authorization, Origin, X-Requested-With, Content-Type, Accept');
    echo $body;

Это работает.Но я не должен генерировать CORS-заголовки в своем API.

Однако, как уже говорилось выше, когда я не генерирую из PHP, но включаю заголовки в NGINX - за пределами OPTIONS'if', например:

 add_header 'Access-Control-Allow-Origin' '*';
 add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, HEAD';
 add_header 'Access-Control-Allow-Headers' 'Authorization, Origin, X-Requested-With, Content-Type, Accept';

 if ($request_method = 'OPTIONS') {
    add_header 'Access-Control-Allow-Origin' '*';
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, HEAD';
    add_header 'Access-Control-Allow-Headers' 'Authorization, Origin, X-Requested-With, Content-Type, Accept';
    add_header 'Access-Control-Max-Age' 1728000;
    return 204;
 }

, он будет генерировать заголовки, только если мои PHP-скрипты не запускаются.Если они запускаются, заголовки добавленные в nginx не создаются.Они отображаются заменены с двумя моими основными заголовками (статус и тип), которые я генерирую в своем ответе.Итак ... Я получаю обработку CORS для запроса OPTIONS, но не для чего-либо еще.И запрашивающие клиенты терпят неудачу с ошибками CORS, после того, как они проходят предварительную проверку.

Хотя Apache и не обработал это без проблем, если я не делаю что-то не так, похоже, что NGINX не будет генерировать заголовки, если мой ответ содержит заголовки вЭто...?Как правильно решить эту проблему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...