it-swarm.com.de

POST Anfrage nicht erlaubt - 405 Nicht erlaubt - Nginx, auch mit Kopfzeilen

Ich habe ein Problem mit dem Versuch, eine POST -Anforderung in meiner Anwendung auszuführen, und ich habe viel gesucht, aber ich habe keine Lösung gefunden. 

Ich habe also eine nodeJS-Anwendung und eine Website, und ich versuche, eine POST -Anfrage mit einem Formular von dieser Site zu machen, aber ich ende immer damit:

enter image description here

und in der Konsole sehe ich:

    Uncaught TypeError: Cannot read property 'value' of null 
Post "http://name.github.io/APP-example/file.html " not allowed

das ist in dieser Codezeile: 

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;

Ich habe viele Beiträge und eine Dokumentation über domänenübergreifend gelesen, aber es hat nicht funktioniert. Forschungsquelle 1: http://enable-cors.org/server.html Forschungsquelle 2: http://www.w3.org/TR/2013/CR-cors -20130129/# http-access-control-max-age

Was mache ich jetzt: 

Ich versuche, POST von einer anderen Domäne meines Servers aus:

POSTANFRAGE: http://name.github.io/APP-example/file.html , github-Repository

POST-LISTENER: " http: //xxx.xxx.x.xx: 9000/email , server localhost (x-> meine IP-Adresse) 

Ich hatte also das gleiche Problem in anderen Dateien, aber ich habe es behoben, der diesen Code vor Beginn jeder Route einfügte:

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

und ich habe es repariert.

Jetzt habe ich das gleiche Problem, aber in dieser Datei besteht der einzige Unterschied darin, dass ich mich mit SMTP und E-Mails beschäftige. Daher poste ich eine E-Mail und sende eine E-Mail an diese E-Mail, die ich in der Anfrage POST erhalten habe. 

Der Code funktioniert mit POSTMAN absolut einwandfrei. Wenn ich also mit POSTMAN teste, funktioniert er und ich kann posten. 

Ich habe diesen Code unten anstelle des ersten, den ich gezeigt habe, eingefügt, aber er hat nicht so gut funktioniert:

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

Weiß jemand, wie man es löst? 

Vielen Dank.

38
debeka

Diese Konfiguration für Ihre nginx.conf sollte Ihnen helfen.

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;

    # ...
}
43
Baskar

Dies ist die echte Proxy-Umleitung an den vorgesehenen Server.

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

Ich habe festgestellt, dass dies nicht mit einem statischen zuerst-dann-umgekehrten Proxy-Setup funktioniert. So sieht das aus:

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

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

Ich hatte ein ähnliches Problem, aber nur mit Chrome funktionierte Firefox. Ich habe festgestellt, dass Chrome der Header-Anfrage einen Origin-Parameter hinzugefügt hat.

Also habe ich in meiner nginx.conf den Parameter hinzugefügt, um ihn unter location/block zu vermeiden

proxy_set_header Origin "";
0
SCG

Ich habe die Lösung ausprobiert, die 405 auf 200 umleitet, und in der Produktionsumgebung (in meinem Fall Google Load Balancing mit Nginx Docker-Container) verursacht dieser Hack etwa 502 Fehler (Fehlercode für Google Load Balancing: backend_early_response_with_non_error_status). 

Am Ende habe ich diese Arbeit richtig gemacht, indem ich Nginx durch OpenResty ersetzt habe, das vollständig mit Nginx kompatibel ist und über mehr Plugins verfügt.

Mit ngx_coolkit konnte Nginx (OpenResty) statische Dateien mit der Anforderung POST ordnungsgemäß bereitstellen. In meinem Fall ist dies die Konfigurationsdatei:

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

In der obigen Konfiguration verwende ich override_method, das von ngx_coolkit angeboten wird, um die HTTP-Methode mit GET zu überschreiben.

0
Siyuan Zhang