Nginx https yeniden yazma POST'u GET'e çevirir


17

Proxy sunucum A ipinde çalışıyor ve insanlar web servisime bu şekilde erişiyor. Nginx yapılandırması ip B'deki bir sanal makineye yönlendirecektir.

IP A'daki proxy sunucusu için bunu sitelerimde var

server {
        listen 443;
        ssl on;
        ssl_certificate nginx.pem;
        ssl_certificate_key nginx.key;

        client_max_body_size 200M;
        server_name localhost 127.0.0.1;
        server_name_in_redirect off;

        location / {
                proxy_pass http://10.10.0.59:80;
                proxy_redirect http://10.10.0.59:80/ /;

                proxy_set_header Host $http_host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

}

server {
        listen 80;
        rewrite     ^(.*)   https://$http_host$1 permanent;
        server_name localhost 127.0.0.1;
        server_name_in_redirect off;
        location / {
                proxy_pass http://10.10.0.59:80;
                proxy_redirect http://10.10.0.59:80/ /;
                proxy_set_header Host $http_host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
}

proxy_redirectAlındı ı yeniden yazma yoluyla HTTP POST isteklerini iletmek için nginx nasıl giriş yapabiliriz?

Genel IP'ye çarpan her şey, yeniden yazma nedeniyle 443'e çarpacak. Dahili olarak, sanal makinede 80'e yönlendiriyoruz.

Ancak yapılandırmamızı test etmek için aşağıdaki gibi bir python komut dosyası çalıştırdığımda

import requests

data = {'username': '....', 'password': '.....'}
url = 'http://IP_A/api/service/signup'

res  = requests.post(url, data=data, verify=False)
print res
print res.json
print res.status_code
print res.headers

Ben alıyorum 405 Method Not Allowed. Nginx'te, dahili sunucuya çarptığında, GETorijinal başlıkta bir POST(Python komut dosyasında gösterilmiştir) olsa bile , dahili nginx'in bir istek aldığını gördük .

Yani yeniden yazmada sorun var gibi görünüyor. Bunu nasıl düzeltebileceğine dair bir fikrin var mı? Yeniden yazmayı yorumladığımda, kesinlikle 80'e vurur ve geçti. Yeniden yazma dahili sunucumuzla konuşabildiğinden, yeniden yazma işleminin hiçbir sorunu yoktur. Bu sadece yeniden yazma, atılan POSTetmek GET.

Teşekkür ederim!

(Bu aynı zamanda Nginx forumunda da sorulacaktır, çünkü bu kritik bir engelleyicidir ...)

Yanıtlar:


8

Nginx değil, tarayıcınız.

RFC2616'dan not:

RFC 1945 ve RFC 2068, istemcinin yeniden yönlendirilen istekte yöntemi değiştirmesine izin verilmediğini belirtir. Ancak, mevcut kullanıcı aracısı uygulamalarının çoğu 302'ye 303 yanıtı gibi davranarak Konumda bir GET gerçekleştirir [..]

Bu, tüm popüler tarayıcılar için geçerlidir ve bu konuda yapabileceğiniz hiçbir şey yoktur.


@ c2h50h HTTP spesifikasyonunun buna benzer bir şey ifade ettiğini anlıyorum. Ama Nginx'te ne yapabilirim? Bu bir iç 80 portuna ileri 443 kişi, ama yine de yapabileceği önemsiz bir kurulum demek PUT, POST, DELETE, GET. Önceki kurulumumda kalabalığa hizmet eden ön tarafta bu ekstra vekil yoktu. Aynı dahili sunucuda (test sunucumuz) aynı yapılandırmaya sahiptim. Güzel çalışıyor.
CppLearner

Hiçbir şey değil. % 100 müşteri tarafı. Bir web sunucusu, herhangi bir web sunucusu 301 veya 302 yönlendirmesi döndürürse, istemci tarafında tarayıcı herhangi bir istek türünün yerini alır GET. Hiçbir sunucu tarafı yapılandırması veya döndürülen herhangi bir http başlığı bunu değiştirmez. Tarihsel nedenlerden ötürü (erken tarayıcılar yanlış anlama nedeniyle bu şekilde davrandı ve fiili bir standart haline geldi).
c2h5oh

Birincisi, bu gerçekten bir tarayıcı değil. Tarayıcı protokolü diyebilirsin çünkü HTTP protokolü kullanıyor .. tamam .. bu iyi. Ama yine de, bu sadece bu iki katmanlı konfigürasyon üzerinde yapıyordum gibi görünüyor. Aynı yapılandırmayı doğrudan dahili makineye koyacak ve testi orada yapacak olsaydım, şikayet etmeyecekti. Ama sonra tekrar, insanlar bunu üretimlerinde nasıl yapıyor? Bazı insanların benzer şeyler yaptığını varsayıyorum, 443'ü sadece 80 çalışan bazı VM'lere ters çevir. Daha iyi bir uygulama varsa, öğrenmek ve duymak isterim.
CppLearner

1
Tarayıcı ile HTTP istemcisi demek istedim ve 301 veya 302 yeniden yönlendirilirse tüm popüler istemcilerle birlikte POSTolacak GET. POST, proxy yönlendirmesinde POST olarak kalır, ancak yeniden yazmada kalmaz.
c2h5oh

1
RFC2616 tekrar: If the 307 status code is received in response to a request other than GET or HEAD, the user agent MUST NOT automatically redirect the request unless it can be confirmed by the user, since this might change the conditions under which the request was issued.Bu yüzden çoğu tarayıcı bir uyarı mesajı açacaktır, diğer HTTP istemcileri için davranışlarının ne olacağını bile tahmin edemiyorum.
c2h5oh

1

Bulduğum POST /api/branddönüştü ediliyordu GET /api/brand(web uygulaması çünkü kullanıyordum flask-restful) "geçersiz" isteği yapan oldu. Eğer POST /api/brand/kullansaydım (izlemeye dikkat et /), başarılı oldu.


Postman django rest-auth girişini test etmek için kullanıyordum ve aynı sorunu görüyordum. Anahtar POST isteği sondaki '/' ihmal etmişti.
Steve L
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.