LINUX.ORG.RU

Nginx не отдаёт ответ на OPTIONS

 ,


0

1

Всем привет,

Есть 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.