我正在尝试弄清楚如何允许在 nginx 中将 PUT 放到静态文件,put 请求将被代理到 php 脚本。我尝试使用 curl 执行的请求示例如下:
curl -X PUT -d "tags=abc,def" cp.local/api/Image/myimage.jpg
这会在 nginx 中抛出 405 Not Allowed。其他 URL 也可以,例如:
curl -X PUT -d "tags=abc,def" cp.local/api/Image/myimage.pdf
我读过论坛主题有人遇到了类似的问题,但是使用的是 POST,但它已经过时了,而且线程中似乎没有真正的解决方案。
相关的 nginx 配置指令是:
location ~* ^/api/.*$ {
root /my/path/public;
fastcgi_param SCRIPT_FILENAME /my/path/public/Api.php;
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
}
答案1
您除了获取静态文件外什么都做不了。如果您想要 POST、PUT、DELETE 等,则需要确保您有一个处理 URI 的位置块,并且该位置块以允许此类请求的方式处理请求。
例如通过 proxy_passing 传递到 Apache 或通过 fastcgi_passing 传递到 PHP。
使用您提供的配置,理论上应该允许。但是您删除了很多信息,而且很可能您有一个位置块来捕获静态文件。当您处理正则表达式位置时,将使用第一个匹配的位置,因此您需要确保您的 api 位置在任何其他匹配位置之前定义。
答案2
拦截 HTTP 状态 405 并使用脚本处理请求:
error_page 405 = /api/Api.php;