Запрос 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();
});
Кто-нибудь знает, как его решить?
Спасибо.
Ответы
Ответ 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;
}
Это сработало.