Nginx
Nginx POST 請求在使用 Ajax 時更改為 GET
我有一個用於商店的 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”發送請求,它會更改為 aGET
並且所有參數都將失去。這是我的
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
.如何保留請求的請求類型和參數?
您在這裡使用 a
location @api
和 arewrite
沒有多大意義。就目前而言,您的請求必須通過三個不同的location
塊進行處理,然後才能最終向上游發送到 PHP。它也與我期望看到的正常模式相反。正如 Ivan Shatsky 在評論中提到的那樣,該請求似乎被自動 301 重定向所破壞,
/api
該/api/
Web 伺服器始終適用於與目錄對應的路徑。我會將這些
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 也指出的那樣,這不是一個好習慣。