Nginx

Nginx POST 請求在使用 Ajax 時更改為 GET

  • July 9, 2020

我有一個用於商店的 Nginx 伺服器。該商店有一個 API,它位於我使用別名的不同文件夾中。這是我example.comsites-enabledNginx 中的:

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.

如何保留請求的請求類型和參數?

您在這裡使用 alocation @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 也指出的那樣,這不是一個好習慣。

引用自:https://serverfault.com/questions/1024622