在 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 脚本而不是静态内容,因此POST
Nginx 应该允许请求并且有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
错误。