POST 请求时出现 405(不允许)

POST 请求时出现 405(不允许)

在 Winginx 出现问题之前,一切都正常。当我使用 Jquery 的 POST 方法发送数据时,我收到 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"

一切正常,除了一些数据被传输。

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

答案1

通常这些错误消息是由于以下限制引起的: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;
    }

如您所见,只有以 结尾的位置.php才会使用 fastcgi 处理,而包括 在内的所有其他位置/formcheck都只location /提供静态内容,从而导致405错误。

相关内容