POST 请求出现 405(不允许)

Tel*_*ion 4 php nginx

在 Winginx 出现问题之前,一切正常。当我使用 POST 方法使用 Jquery 发送数据时,出现 405(不允许)错误。GET 工作得很好。

当我从 /formcheck(它是 forcmcheck.php 并且可以正常工作)请求数据时,我收到此错误。除了重写引擎的几行之外,我没有更改 Nginx 日志中的任何内容。

你可以看到日志:

127.0.0.1 - - [07/Jun/2017:15:14:06 +0300] "POST /formcheck HTTP/1.1" 405 575 "http://music-portfolio.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
127.0.0.1 - - [07/Jun/2017:15:16:35 +0300] "POST /formcheck HTTP/1.1" 405 575 "http://music-portfolio.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
127.0.0.1 - - [07/Jun/2017:15:17:32 +0300] "POST /formcheck HTTP/1.1" 405 575 "http://music-portfolio.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
Run Code Online (Sandbox Code Playgroud)

这里一切正常,除了传输了任何数据。

我不知道如何或在何处阻止 POST,但我需要允许它...

Esa*_*nen 9

通常这些错误消息是由Nginx 无法根据POST请求提供静态内容的限制引起的。InValidLogic.com 的文章通过来自 Nginx 的 POST 提供静态内容对此问题进行了讨论并提出了解决方法:在这种情况下,您可以使用error_page 405 =200 $uri;静态内容替换错误消息或为静态内容创建代理,将POST请求转换为GET.

但是,在这种情况下,您/formcheck实际上是一个 PHP 脚本而不是静态内容,因此POSTNginx 应该允许请求并且有POST数据要接收,因此转换GET为也不是一种选择。

看来你有两个location部分:

    location / {
        if ($host ~ ^(www\.)?([a-z0-9\-\.]+)$){
            root home/$2/public_html;
            access_log  logs/$2-access.log  main;
        }
    }

    location ~ \.php$ {
        if ($host ~ ^(www\.)?([a-z0-9\-\.]+)$){
            root home/$2/public_html;
            access_log  logs/$2-access.log  main;
        }
        if (!-e $document_root$document_uri){return 404;}
        fastcgi_pass localhost:9071;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,只有结束位置.php与FastCGI的处理,而其他一切,包括/formcheck落入location /服务只为静态内容,从而导致405错误。