Подтвердить что ты не робот

Запрос 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

который находится в этой строке кода:

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 из другого домена моего сервера:

ПОЧТОВЫЙ ЗАПРОС: 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();
        });

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

Спасибо.

4b9b3361

Ответ 1

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

    # ...
}

Ответ 2

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

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;

  }
}

Ответ 3

Я заметил, что это не работало с установкой static-first-then-reverse-proxy. Вот что это выглядит:

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

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

Ответ 4

Я попробовал решение, которое перенаправляет 405-200, а в производственной среде (в моем случае это Балансировка загрузки Google с помощью контейнера Dginx Nginx), этот хак вызывает около 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.

Ответ 5

У меня была похожая проблема, но только с Chrome Firefox работал. Я заметил, что Chrome добавляет параметр Origin в запрос заголовка.

Поэтому в моем nginx.conf я добавил параметр, чтобы избежать его в расположении/блоке

proxy_set_header Origin "";

Ответ 6

В моем случае это была посылка JSON для обработки и получения возвращаемого значения. Я перепроверил логи моего сервера приложений с и без nginx. Что я получил, так это то, что мое местоположение не добавлялось к URL-адресу proxy_pass, а версия протокола 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;
}

Это сработало.