Nginx 使用 Ajax 时 POST 请求改为 GET

Nginx 使用 Ajax 时 POST 请求改为 GET

我有一台用于商店的 Nginx 服务器。该商店有一个 API,位于不同的文件夹中,我为其使用了别名。这是我在 Nginx 中example.com的来源:sites-enabled

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”发送请求,它会被更改为 a 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

如何保存请求的请求类型和参数?

答案1

您在这里使用 alocation @api和 arewrite并没有多大意义。就目前情况而言,您的请求必须经过三个不同的location块处理,然后才能最终发送到上游 PHP。这也与我期望看到的正常模式相反。

正如 Ivan Shatsky 在评论中提到的那样,请求似乎被自动 301 重定向所破坏,因为/apiWeb/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不带尾随斜杠的路径,尽管 Ivan Shatsky 也指出,这不是一个好的做法。

相关内容