Node.js POST请求不允许-405不允许-nginx,即使包含头

Node.js POST请求不允许-405不允许-nginx,即使包含头,node.js,express,nginx,cross-domain,nodemailer,Node.js,Express,Nginx,Cross Domain,Nodemailer,我在我的应用程序中尝试进行POST请求时遇到了问题,我搜索了很多,但没有找到解决方案 因此,我有一个nodeJS应用程序和一个网站,我正试图使用该网站的表单进行POST请求,但我总是以以下方式结束: 在控制台中,我看到: Uncaught TypeError: Cannot read property 'value' of null Post "http://name.github.io/APP-example/file.html " not allowed 在这一行代码中: fi

我在我的应用程序中尝试进行POST请求时遇到了问题,我搜索了很多,但没有找到解决方案

因此,我有一个nodeJS应用程序和一个网站,我正试图使用该网站的表单进行POST请求,但我总是以以下方式结束:

在控制台中,我看到:

    Uncaught TypeError: Cannot read property 'value' of null 
Post "http://name.github.io/APP-example/file.html " not allowed
在这一行代码中:

file.html:

<form id="add_Emails" method ="POST" action="">

    <textarea rows="5" cols="50" name="email">Put the emails here...
    </textarea>

        <p>
        <INPUT type="submit" onclick="sendInvitation()" name='sendInvitationButton' value ='Send Invitation'/>
        </p>


</form>

<script src="scripts/file.js"></script>
我读了很多关于跨域的帖子和文档,但都不起作用。 研究资料来源1: 研究资料来源2:

我现在做的是:

我正在尝试从服务器的其他域发布:

POST请求:,github存储库

POST侦听器:“,服务器本地主机(x->我的ip地址)

因此,我在其他文件中也遇到了同样的问题,但我将此代码放在每条路径的行乞中进行了修复:

var express = require('express');
var sha1 = require('sha1'); 

var router = express.Router(); 
var sessionOBJ = require('./session');

var teams = {} 
var teamPlayers = []

router.all('*', function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "X-Requested-With");
  res.header("Access-Control-Allow-Methods", "PUT, GET,POST");
  next();
 });
然后我就修好了

现在,我有同样的问题,但在这个文件中唯一的区别是我处理SMTP和电子邮件,所以我发布了一封电子邮件,并向我在post请求中收到的这封电子邮件发送了一封电子邮件

这段代码在POSTMAN上运行得非常好,所以,当我使用POSTMAN进行测试时,它可以正常工作,我可以发布

我在下面包含了这段代码,而不是我展示的第一段代码,但它不起作用:

router.all('*', function(req, res, next){
            res.header("Access-Control-Allow-Origin", "*")
            res.header("Access-Control-Allow-Methods", "POST, GET, OPTIONS")
            res.header("Access-Control-Allow-Headers", "Origin, Content-Type, Accept")
            res.header("Access-Control-Max-Age", "1728000")
            next();
        });
有人知道怎么解决吗


谢谢。

此nginx.conf配置应该对您有所帮助


这是到预期服务器的真正代理重定向

server {
  listen          80;
  server_name     localhost;
location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-NginX-Proxy true;
    proxy_pass http://xx.xxx.xxx.xxx/;
    proxy_redirect off;
    proxy_set_header Host $host;

  }
}

我注意到这不适用于先静态后反向代理设置。下面是它的外观:

location @app {
  proxy_pass http://localhost:3000$request_uri;
}

location / {
  try_files $uri $uri/ @app;
  error_page 405 @app;
}

我已经尝试过将405重定向到200的解决方案,在生产环境中(在我的例子中,是使用Nginx Docker容器的Google负载平衡),这种攻击会导致一些502个错误(Google负载平衡错误代码:backend_early_response_,状态为non_error_)

最后,我将Nginx替换为OpenResty,它与Nginx完全兼容,并且有更多的插件,从而使这项功能正常工作

现在,Nginx(OpenResty)可以通过POST请求正确地提供静态文件,以下是我的配置文件:

server {
  listen 80;

  location / {
    override_method GET;
    proxy_pass http://127.0.0.1:8080;
  }
}

server {
  listen 8080;
  location / {
    root /var/www/web-static;
    index index.html;
    add_header Cache-Control no-cache;
  }
}

在上面的配置中,我使用提供的
override_method
来重写HTTP方法,以
GET
我也有类似的问题,但只有在Chrome上,Firefox才起作用。我注意到Chrome在头请求中添加了一个Origin参数

因此,在我的nginx.conf中,我在location/block下添加了参数以避免它


在我的例子中,这是一个json的后期提交,需要处理并获得返回值。我交叉检查了我的应用程序服务器的日志(有nginx和没有nginx)。我得到的是我的位置没有附加到proxy_pass url,HTTP协议版本也不同

  • 没有nginx:“POST/xxQuery HTTP/1.1”200-
  • 使用nginx:“POST/HTTP/1.0”405-
我之前的位置是

location /xxQuery {
    proxy_method POST;
    proxy_pass http://127.0.0.1:xx00/;
    client_max_body_size 10M;
}
我把它改成了

location /xxQuery {
    proxy_method POST;
    proxy_http_version 1.1;
    proxy_pass http://127.0.0.1:xx00/xxQuery;
    client_max_body_size 10M;
}

它起作用了。

我在VueJs上遇到了一个类似的问题,因为VueJs作为前端应用程序托管在
example.com
上,而我的Rails应用程序作为API托管在
API.example.com
上。Vue被配置为通过
ENV
变量
Vue\u app\u API\u BASE\u URL
获取数据

我犯了一个新手错误,忘记在生产服务器上创建
env.production.local
,因此在构建VueJs应用程序时,url从未被拾取。因此,所有请求都被路由到例如
example.com/signin
,而不是
api.example.com/signin
,因此出现了错误


在生产服务器上创建文件并添加变量后,然后重新构建vuejs应用程序,一切正常!

我认为出现问题的原因是静态内容是什么?你能说得更清楚吗?谢谢你的评论!:)如果nginx的特定
位置
包含
代理通行证
快速CGI通行证
指令,这是一个动态内容,否则为静态内容。换句话说,静态内容是指nginx从文件系统读取文件并按原样发送的情况。动态内容是指当某个编程语言生成响应时。要解决此问题,应确保nginx的
位置
处理
http://xxx.xxx.x.xx:9000/email
request contains
proxy\u pass
directive这篇文章描述了在静态文件中解决405 Nginx状态码的3种方法:这是一个黑客,你也没有努力解释。他似乎只是把405改写成了200,让它看起来像是可行的。知道这一点很好如果这确实有效。即,它是否会返回静态资源/Wow,它是有效的。但它确实无法与肮脏的黑客行为区分开来。我正在使用wordpress插件将数据发布到不同的服务器,然后返回响应。有时它可以正常工作,但在大约95%的情况下它失败并返回“405方法不允许使用nginx”" . 在哪里进行nginx.conf设置?我是否必须在远程服务器上安装nginx并执行此配置?请帮助我,我面临着几乎相似的问题,但方式有点不同。可以在以下文章中找到一些进一步的解释:,以及
proxy_set_header Origin "";
location /xxQuery {
    proxy_method POST;
    proxy_pass http://127.0.0.1:xx00/;
    client_max_body_size 10M;
}
location /xxQuery {
    proxy_method POST;
    proxy_http_version 1.1;
    proxy_pass http://127.0.0.1:xx00/xxQuery;
    client_max_body_size 10M;
}