POST запрос не разрешен-405 не разрешен-nginx, даже с включенными заголовками
у меня есть проблема в попытке сделать запрос POST в моем приложении, и я много искал, но я не нашел решения.
Итак, у меня есть приложение nodeJS и веб-сайт, и я пытаюсь сделать запрос POST, используя форму с этого сайта, но я всегда заканчиваю в этом:
и в консоли я вижу :
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
.