В идеале я бы хотел выполнить эту настройку:
- 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 не будет генерировать заголовки, если мой ответ содержит заголовки вЭто...?Как правильно решить эту проблему?