nginx 405 使用 try_files 进行 DELETE 请求而不是代理

nginx 405 使用 try_files 进行 DELETE 请求而不是代理

我使用以下配置将 nginx 代理到 php-fpm:

location / {
  try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
  fastcgi_pass   127.0.0.1:9000;
  fastcgi_index  index.php;
  fastcgi_param  SCRIPT_FILENAME /vol/app/www/$fastcgi_script_name;
  include        fastcgi_params;
}

```

一切运行正常,直到收到如下 DELETE 请求:

DELETE /?file&path=foo

发生这种情况时,nginx 会返回 405(方法不允许),并且似乎不会将请求代理到 php-fpm。将 DELETE/PUT 请求发送到代理的最佳方法是什么?有没有办法绕过try_files这种类型的请求?

当访问此 URL 时,我在 error.log 中看不到任何内容,但 access.log 显示:

68.50.105.169 - - [20/Mar/2016:17:48:57 +0000] "DELETE /?file=client_img1.png&fileupload=e35485990e HTTP/1.1" 405 574 "http://ec2-foo.compute.amazonaws.com/jobs/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36" "-"

我已经确认没有碰到代理。我的假设是 nginx 在第一次“尝试”时阻止了 DELETEtry_files

答案1

我刚刚遇到了一个类似的情况,症状完全相同。问题是请求在与 try_files index.php 匹配之前先与文件夹索引匹配。当您的 try_files 如下所示时:

try_files $uri $uri/ /index.php?$args; 

如果你请求任何文件夹,你将在 /index.php?$args 匹配之前获得 $uri/ 匹配,并且如果有一个带有 index.php 设置的 index 指令,例如

index  index.html index.htm index.php;

其中包含 index.php,通过索引可以到达 php。因此,当您尝试执行删除或放置请求时,nginx 会发现您实际上是在尝试对文件夹索引执行该请求。这会导致 405 Not Allowed 响应。

如果您在其他方法有效的地方收到 405 响应,则很可能是因为文件夹索引在 try_files 中的 php 文件之前匹配。确定这种情况的一种方法是关闭自动索引,然后查看 GET 请求是否仍然有效。

相关内容