Всем привет,
Есть api на php, есть сервер, который этот код выполняет. Работает там стандартная связка php-fpm+nginx. Если браузер отправляет запрос OPTIONS на сервер, nginx отвечает:
<html>
<head><title>405 Not Allowed</title></head>
<body bgcolor="white">
<center><h1>405 Not Allowed</h1></center>
<hr><center>nginx/1.14.2</center>
</body>
</html>
В самом php это реализовано примерно так:
$app->options(
'/',
function () use ($app) {
$allowedOrigin = '';
$allowedHeaders = $app->request->getHeader('Access-Control-Request-Headers') ?? '*';
$allowedMethods = 'OPTIONS, GET, POST, PUT, DELETE';
$allowedHosts = [
'host',
'another-host',
'and-another-host'
];
$origin = parse_url($app->request->getHeader('Origin'));
$host = $origin['host'] ?? '';
$port = $origin['port'] ?? '';
$scheme = $origin['scheme'] ?? '';
foreach ($allowedHosts as $allowedHost) {
if (mb_substr($host, mb_strlen($allowedHost) * -1) === $allowedHost) {
$allowedOrigin = "{$scheme}://{$host}";
if ($port) {
$allowedOrigin = "{$allowedOrigin}:{$port}";
}
break;
}
}
http_response_code(200);
header("Allow: {$allowedMethods}");
header("Access-Control-Allow-Origin: {$allowedOrigin}");
header("Access-Control-Allow-Headers: {$allowedHeaders}");
header("Access-Control-Allow-Methods: {$allowedMethods}");
}
);
Т.е. по идее код должен отдавать OPTIONS, но до php-fpm, похоже, запрос не доходит.
На данный момент это решено через if и add_header, заголовки cors отдаёт nginx. Но есть ли лучше метод, нежели чем пихать все заголовки в конфиг вебсервера? Или это нормальная практика? Плюс, я так понял, в nginx лушче не использовать if.