web-dev-qa-db-ja.com

POSTリクエストは許可されていません-405許可されていません-ヘッダーが含まれていてもnginx

アプリケーションでPOSTリクエストを実行しようとして問題があり、よく検索しましたが、解決策が見つかりませんでした。

したがって、nodeJSアプリケーションとWebサイトがあり、このサイトのフォームを使用してPOSTリクエストを実行しようとしていますが、常に次のようになります。

enter image description here

そして、コンソールで私は見る:

    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>

file.js:

function sendInvitation(){

    var teammateEmail= document.getElementById("email").value;

クロスドメインに関する多くの投稿とドキュメントを読みましたが、うまくいきませんでした。研究ソース1: http://enable-cors.org/server.html 研究ソース2: http://www.w3.org/TR/2013/CR-cors- 20130129 /#http-access-control-max-age

私が今していること:

サーバーの別のドメインからPOSTしようとしています:

POSTリクエスト: http://name.github.io/APP-example/file.html 、githubリポジトリ

POST LISTENER: " http://xxx.xxx.x.xx:9000/email 、サーバーlocalhost(x-> my ip address)

そのため、他のファイルでも同じ問題が発生していましたが、各ルートの最初にこのコードを追加して修正しました。

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();
        });

誰かがそれを解決する方法を知っていますか?

ありがとうございました。

42
debeka

あなたのnginx.confへのこの設定はあなたを助けるはずです。

https://Gist.github.com/baskaran-md/e46cc25ccfac83f153bb

server {
    listen       80;
    server_name  localhost;

    location / {
        root   html;
        index  index.html index.htm;
    }

    error_page  404     /404.html;
    error_page  403     /403.html;

    # To allow POST on static pages
    error_page  405     =200 $uri;

    # ...
}
47
Baskar

これは、目的のサーバーへの実際のプロキシリダイレクトです。

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;

  }
}
2
Indra Uprade

Static-first-then-reverse-proxyセットアップではこれが機能しないことに気付きました。これは次のようなものです。

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

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

同様の問題がありましたが、ChromeでのみFirefoxが機能していました。 ChromeがヘッダーリクエストにOriginパラメーターを追加していることに気付きました。

だから私のnginx.confでは、location /ブロックの下にそれを避けるためにパラメータを追加しました

proxy_set_header Origin "";
0
SCG

405を200にリダイレクトするソリューションを試しましたが、実稼働環境(私の場合は、Nginx Dockerコンテナーを使用したGoogle Load Balancing)で、このハックによっていくつかの502エラーが発生します(Google Load Balancingエラーコード:backend_early_response_with_non_error_status)。

最後に、NginxをNginxと完全に互換性があり、より多くのプラグインを持つOpenRestyに置き換えることにより、この作業を適切に行いました。

ngx_coolkit を使用すると、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;
  }
}

上記の構成では、 ngx_coolkit が提供するoverride_methodを使用して、HTTPメソッドをGETにオーバーライドします。

0
Siyuan Zhang