У меня есть сервер 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
как путь без косой черты в конце, хотя, как указал Иван Шацкий, это не лучшая практика.