Wacdis
@Wacdis
PHP, Python, GO, Rust, NodeJS, SOA/MSA

Как в NGINX пропустить запрос OPTIONS в php-fpm?

Добрый день, коллеги!

Вопрос настройки NGINX конфига: как сделать, чтобы запросы PUT, PATCH, HEAD, DELETE, OPTIONS и другие, помимо GET и POST, доходили до php-fpm?

Спасибо за помощь

upd1: не интересует ответ самого NGINX, как тут. Нужно именно, чтобы PHP видел эти все запросы!
upd2: запросы кросс-доменные. Например, с test1.ru на api.domain.com
Решение: Нельзя отправлять запросы, отличные от GET/POST/HEAD на / адрес хоста.
  • Вопрос задан
  • 213 просмотров
Решения вопроса 1
karabanov
@karabanov
Системный администратор
Для включения указанных методов намеренно делать ничего не надо, так как они доступны по умолчанию. Вот что бы отключить некоторые методы, да надо приложить усилия.

В подтверждение своих слов приведу пример:

docker-compose.yml

version: '3'

services:
  alpine-nginx:
    image: nginx:stable-alpine
    container_name: alpine-nginx
    restart: "no"
    links:
      - composer-php
    volumes:
      - ./default.conf:/etc/nginx/conf.d/default.conf
      - ./code:/code
    ports:
      - "80:80"

  composer-php:
    image: php:7-fpm
    container_name: composer-php
    restart: "no"
    volumes:
      - ./code:/code
    ports:
      - "9000:9000"



default.conf

server {
  listen 80;
  listen [::]:80;

  client_max_body_size 2M;

  server_name domain.com admin.domain.com www.domain.com api.domain.com;

  charset utf-8;
  index index.php;

  root /code;

  gzip on;
  location / {
    try_files $uri $uri/ @phpindex;
  }

  location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass composer-php:9000;
    fastcgi_index index.php;
    include fastcgi_params;

    fastcgi_param   QUERY_STRING            $query_string;
    fastcgi_param   REQUEST_METHOD          $request_method;
    fastcgi_param   CONTENT_TYPE            $content_type;
    fastcgi_param   CONTENT_LENGTH          $content_length;
    fastcgi_param   SCRIPT_FILENAME         $realpath_root$fastcgi_script_name;
    fastcgi_param   SCRIPT_NAME             $fastcgi_script_name;
    fastcgi_param   PATH_INFO               $fastcgi_path_info;
    fastcgi_param   PATH_TRANSLATED         $document_root$fastcgi_path_info;
    fastcgi_param   REQUEST_URI             $request_uri;
    fastcgi_param   DOCUMENT_URI            $document_uri;
    fastcgi_param   DOCUMENT_ROOT           $realpath_root;
    fastcgi_param   SERVER_PROTOCOL         $server_protocol;
    fastcgi_param   GATEWAY_INTERFACE       CGI/1.1;
    fastcgi_param   SERVER_SOFTWARE         nginx/$nginx_version;
    fastcgi_param   REMOTE_ADDR             $remote_addr;
    fastcgi_param   REMOTE_PORT             $remote_port;
    fastcgi_param   SERVER_ADDR             $server_addr;
    fastcgi_param   SERVER_PORT             $server_port;
    fastcgi_param   SERVER_NAME             $server_name;
  }

  location @phpindex {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass composer-php:9000;
    fastcgi_index index.php;
    include fastcgi_params;

    set $index_name /index.php;

    fastcgi_param   QUERY_STRING            $query_string;
    fastcgi_param   REQUEST_METHOD          $request_method;
    fastcgi_param   CONTENT_TYPE            $content_type;
    fastcgi_param   CONTENT_LENGTH          $content_length;
    fastcgi_param   SCRIPT_FILENAME         $realpath_root$index_name;
    fastcgi_param   SCRIPT_NAME             $index_name;
    fastcgi_param   PATH_INFO               $fastcgi_path_info;
    fastcgi_param   PATH_TRANSLATED         $document_root$fastcgi_path_info;
    fastcgi_param   REQUEST_URI             $request_uri;
    fastcgi_param   DOCUMENT_URI            $document_uri;
    fastcgi_param   DOCUMENT_ROOT           $realpath_root;
    fastcgi_param   SERVER_PROTOCOL         $server_protocol;
    fastcgi_param   GATEWAY_INTERFACE       CGI/1.1;
    fastcgi_param   SERVER_SOFTWARE         nginx/$nginx_version;
    fastcgi_param   REMOTE_ADDR             $remote_addr;
    fastcgi_param   REMOTE_PORT             $remote_port;
    fastcgi_param   SERVER_ADDR             $server_addr;
    fastcgi_param   SERVER_PORT             $server_port;
    fastcgi_param   SERVER_NAME             $server_name;
  }
  location ~ /\.ht {
    deny  all;
  }
}



code/index.php

<?php

header('X-PHP-REQUEST_METHOD: ' . $_SERVER['REQUEST_METHOD']);

echo $_SERVER['REQUEST_METHOD'];

echo "\n\n"
?>



Результат

zend@zbook:~$ curl -X GET http://api.domain.com/ -d ''
GET

zend@zbook:~$ curl -X POST http://api.domain.com/ -d ''
POST

zend@zbook:~$ curl -X DELETE http://api.domain.com/user/1000
DELETE

zend@zbook:~$ curl -X OPTIONS http://api.domain.com/user/1000
OPTIONS

zend@zbook:~$ curl -X PATCH http://api.domain.com/user/1000
PATCH

zend@zbook:~$ curl -I http://api.domain.com/user/1000
HTTP/1.1 200 OK
Server: nginx/1.20.1
Date: Sun, 18 Jul 2021 18:05:05 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/7.4.21
X-PHP-REQUEST_METHOD: HEAD

zend@zbook:~$ curl -X PUT http://api.domain.com/user/1000
PUT

Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Wacdis
@Wacdis Автор вопроса
PHP, Python, GO, Rust, NodeJS, SOA/MSA
Нашел иголку в стогу сена... Все работало и у меня. Разница в URL запроса. Я все запросы отправлял на / адрес. А нельзя, видимо, отправлять запросы, отличные от GET POST и HEAD на /

Правильным ответом буду считать Ваш, Александр Карабанов, так как нашел отличие в вашем совете.

Спасибо!
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы