POST запрос не разрешен-405 не разрешен-nginx, даже с включенными заголовками

у меня есть проблема в попытке сделать запрос POST в моем приложении, и я много искал, но я не нашел решения.

Итак, у меня есть приложение nodeJS и веб-сайт, и я пытаюсь сделать запрос POST, используя форму с этого сайта, но я всегда заканчиваю в этом:

enter image description here

и в консоли я вижу :

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

вот в этой строке кода :

.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>
.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 ЗАПРОС : http://name.github.io/APP-example/file.html, репозиторий github

СООБЩЕНИЕ СЛУШАТЕЛЯ :"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.

код работает совершенно нормально с почтальоном, поэтому, когда я тестирую с почтальоном, он работает, и я могу опубликовать.

я включил этот код ниже вместо первого, который я показал, но он не работал:

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

кто-нибудь знает как ее решить?

спасибо.

4 ответов


эта конфигурация для вашего 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;

    # ...
}

это реальное перенаправление прокси на предполагаемый сервер.

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, и в производственной среде(в моем случае это балансировка нагрузки Google с контейнером Nginx Docker), этот хак вызывает некоторые ошибки 502(код ошибки балансировки нагрузки Google: backend_early_response_with_non_error_status).

В конце концов, я сделал эту работу правильно, заменив Nginx на OpenResty, который полностью совместим с Nginx и имеет больше плагинов.

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

В приведенной выше конфигурации я использую override_method предложил ngx_coolkit чтобы переопределить метод HTTP на GET.