web-dev-qa-db-fra.com

POST demande non autorisée - 405 non autorisée - nginx, même avec en-têtes inclus

J'ai de la difficulté à essayer de faire une demande POST dans ma candidature et j'ai beaucoup cherché, mais je n'ai pas trouvé la solution. 

J'ai donc une application nodeJS et un site Web, et j'essaie de faire une demande POST à l'aide d'un formulaire de ce site, mais je finis toujours par ceci:

enter image description here

et dans la console je vois:

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

c'est dans cette ligne de code: 

fichier.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>

fichier.js:

function sendInvitation(){

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

J'ai lu de nombreux articles et une documentation de cross domain mais cela n'a pas fonctionné. source de recherche 1: http://enable-cors.org/server.html source de recherche 2: http://www.w3.org/TR/2013/CR-cors -20130129/# http-access-control-max-age

Ce que je fais maintenant: 

J'essaie de POST depuis un autre domaine de mon serveur:

POST REQUEST: http://name.github.io/APP-example/file.html , référentiel github

POST LISTENER: " http: //xxx.xxx.x.xx: 9000/email , serveur localhost (x-> mon adresse ip) 

Donc, j'ai eu le même problème dans d'autres fichiers, mais je l'ai corrigé en mettant ce code au début de chaque route:

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

et je l'ai corrigé en le faisant.

Maintenant, j'ai le même problème, mais dans ce fichier, la seule différence est que je traite avec SMTP et les emails, alors je poste un email et j'envoie un email à cet email que j'ai reçu dans la demande POST. 

Le code fonctionne parfaitement avec POSTMAN. Ainsi, lorsque je teste avec POSTMAN, il fonctionne et je peux publier. 

J'ai inclus ce code ci-dessous au lieu du premier que j'ai montré mais cela n'a pas fonctionné aussi bien:

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

Est-ce que quelqu'un sait comment le résoudre? 

Je vous remercie.

38
debeka

Cette configuration de votre nginx.conf devrait vous aider.

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

C'est la vraie redirection de proxy vers le serveur prévu.

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

J'ai remarqué que cela ne fonctionnait pas avec une configuration statique d'abord, puis inversée. Voici à quoi ça ressemble:

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

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

J'ai eu un problème similaire, mais seulement avec Chrome, Firefox fonctionnait. J'ai remarqué que Chrome ajoutait un paramètre Origin à la demande d'en-tête.

Donc, dans mon nginx.conf, j'ai ajouté le paramètre pour l'éviter sous location/block

proxy_set_header Origin "";
0
SCG

J'ai essayé la solution qui redirige 405 vers 200, et en environnement de production (dans mon cas, il s'agit de l'équilibrage de charge Google avec le conteneur Nginx Docker), ce hack génère 502 erreurs (code d'erreur d'équilibrage de charge Google: backend_early_response_with_non_error_status). 

En fin de compte, j'ai fait en sorte que cela fonctionne correctement en remplaçant Nginx par OpenResty, qui est complètement compatible avec Nginx et qui contient davantage de plugins.

Avec ngx_coolkit , Nginx (OpenResty) peut maintenant servir correctement les fichiers statiques avec la demande POST, voici le fichier de configuration dans mon cas:

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

Dans la configuration ci-dessus, j'utilise override_method offert par ngx_coolkit pour redéfinir la méthode HTTP sur GET.

0
Siyuan Zhang