我有一台用于商店的 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 重定向所破坏,因为/api
Web/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 也指出,这不是一个好的做法。