Назад | Перейти на главную страницу

Запрос POST Nginx изменен на GET при использовании Ajax

У меня есть сервер Nginx для магазина. В этом магазине есть API, который находится в другой папке, для которой я использую псевдоним. Вот мой example.com из sites-enabled в Nginx:

server {
    listen 443 ssl;
    listen [::]:443 ssl;

    server_name www.example.com;

    root /var/www/store/public;

    #certificated go here [edited]

    return 301 https://example.com$request_uri;
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;

    server_name example.com;

    root /var/www/store/public;

    index index.php;

    #certificates go here [edited]

    location /admin {
            index index.php;
    }

    location /api {
            alias /var/www/api/public;
            
            try_files $uri $uri/ @api;

            location ~ \.php$ {
                    include snippets/fastcgi-php.conf;
                    fastcgi_param SCRIPT_FILENAME $request_filename;
                    fastcgi_split_path_info ^(.+\.php)(/.+)$;
                    fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
            }
    }

    location @api{
            rewrite /api/(.*)$ /api/index.php?/$1 last;
    }
  
    #the rest of the store config block [edited]

}

Проблема в том, что если я отправлю POST запрос с использованием ajax на example.com/api заменен на GET и все параметры потеряны.

Вот мой Ajax код:

var foo = 'foo';
var bar = 'bar';

$.ajax({
    type: 'POST',

    beforeSend: function(request) {
        request.setRequestHeader("Authorization", 'xyz');
    },
    url: "https://example.com/api",
    data: { foo: foo, bar: bar},
    processData: false,
    success: function(data) {
        console.log(data);
    }
});

Чтобы проверить это, я просто сбросил $_SERVER['REQUEST_METHOD'].

Если я позвоню example.com/api/index.php тип запроса такой, каким должен быть POST но если я позвоню просто example.com/api он изменен на GET.

Как я могу сохранить тип запроса и параметры для запроса?

Ваше использование location @api и rewrite здесь не имеет особого смысла. В настоящее время ваши запросы должны обрабатываться тремя разными способами. location блоков до того, как они, наконец, будут отправлены вверх по течению в PHP .. Это также обратное от обычного шаблона, который я ожидал увидеть.

Похоже, что запрос обрабатывается автоматическим перенаправлением 301 из /api к /api/ что веб-серверы всегда применяются к путям, которые соответствуют каталогу, как сказал Иван Шацкий в комментарии.

Я бы переписал эти location блоки как:

# This doesn't even need a location
rewrite /api(/.*)? /api/index.php?$1 last;

location /api/index.php {
    alias /var/www/api/public;

    try_files $uri =404;

    include snippets/fastcgi-php.conf;
    fastcgi_param SCRIPT_FILENAME $request_filename;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}

Это также должно позволить вам использовать /api как путь без косой черты в конце, хотя, как указал Иван Шацкий, это не лучшая практика.