Nginx https rewrite POST को GET में बदल देता है


17

मेरा प्रॉक्सी सर्वर आईपी ए पर चलता है और यही से लोग मेरी वेब सेवा तक पहुँच पाते हैं। Nginx कॉन्फ़िगरेशन IP B पर वर्चुअल मशीन पर रीडायरेक्ट करेगा।

आईपी ​​ए पर प्रॉक्सी सर्वर के लिए, मेरी अपनी साइटों में यह उपलब्ध है

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_redirectसे लिया गया है कि कैसे मैं फिर से लिखने के माध्यम से HTTP POST अनुरोध भेजना nginx मिलता है?

सब कुछ जो सार्वजनिक आईपी को हिट करता है वह फिर से लिखने के कारण 443 हिट करेगा। आंतरिक रूप से, हम वर्चुअल मशीन पर 80 को अग्रेषित कर रहे हैं।

लेकिन जब मैं हमारे विन्यास को परखने के लिए एक पायथन लिपि को चलाता हूं जैसे कि नीचे

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

मुझे ए हो रही है 405 Method Not Allowed। नगीनेक्स में हमने पाया कि जब यह आंतरिक सर्वर से टकराया था, तो आंतरिक नगनेक्स को एक GETअनुरोध प्राप्त हो रहा था , भले ही मूल शीर्षलेख में हमने किया था POST(यह पायथन लिपि में दिखाया गया था)।

तो ऐसा लगता है जैसे फिर से लिखना समस्या है। इसे ठीक करने के लिए कोई भी विचार? जब मैंने फिर से लिखा, तो यह निश्चित रूप से 80 हिट हो गया, और यह हो गया। चूंकि फिर से लिखना हमारे आंतरिक सर्वर से बात करने में सक्षम था, इसलिए खुद को फिर से लिखना कोई समस्या नहीं है। यह सिर्फ फिर से लिखने के लिए गिरा दिया POSTहै GET

धन्यवाद!

(यह भी Nginx मंच पर पूछा जाएगा क्योंकि यह एक महत्वपूर्ण अवरोधक है ...)

जवाबों:


8

यह नगनेक्स नहीं है, यह आपका ब्राउज़र है।

RFC2616 से नोट करें:

RFC 1945 और RFC 2068 निर्दिष्ट करते हैं कि क्लाइंट को पुनर्निर्देशित अनुरोध पर विधि बदलने की अनुमति नहीं है। हालाँकि, अधिकांश मौजूदा उपयोगकर्ता एजेंट कार्यान्वयन 302 को मानते हैं जैसे कि यह 303 की प्रतिक्रिया थी, स्थान पर GET का प्रदर्शन कर रहा है [..]

यह सभी लोकप्रिय ब्राउज़रों के लिए सच है और ऐसा कुछ भी नहीं है जो आप इसके बारे में कर सकते हैं।


@ c2h50h मैं समझता हूं कि HTTP कल्पना ने ऐसा ही कुछ कहा है। लेकिन मैं नेगनेक्स में क्या कर सकता हूं? मेरा मतलब है कि यह एक तुच्छ सेटअप जहां एक आंतरिक 80 बंदरगाह के लिए तत्पर 443 लोगों को, लेकिन वे अभी भी कर सकते हैं PUT, POST, DELETE, GET। अपने पिछले सेटअप में मुझे भीड़ को परोसने के मोर्चे पर यह अतिरिक्त प्रॉक्सी नहीं थी। मेरे पास समान आंतरिक सर्वर (हमारे परीक्षण सर्वर) पर समान कॉन्फ़िगरेशन था। यह ठीक काम करता है।
CppLearner

कुछ भी तो नहीं। यह 100% ग्राहक पक्ष है। यदि कोई वेबसर्वर, कोई भी वेबसर्वर, 301 या 302 रीडायरेक्ट लौटाता है, तो ब्राउज़र, क्लाइंट की तरफ, किसी भी प्रकार के अनुरोध को बदल देगा GET। कोई सर्वर-साइड कॉन्फ़िगरेशन या कोई http हेडर वापस नहीं लौटेगा। यह ऐतिहासिक कारणों से ऐसा है (शुरुआती ब्राउज़रों ने गलतफहमी के कारण इस तरह का व्यवहार किया और यह एक वास्तविक मानक बन गया)।
c2h5oh

खैर एक के लिए यह वास्तव में एक ब्राउज़र नहीं है। वैसे आप कह सकते हैं कि यह ब्राउज़र है क्योंकि यह HTTP प्रोटोकॉल का उपयोग करता है..ओके .. ठीक है। लेकिन फिर, ऐसा लगता है कि यह केवल तब होता है जब मैं इस दो-परत कॉन्फ़िगरेशन पर कर रहा था। अगर मुझे उसी कॉन्फ़िगरेशन को सीधे आंतरिक मशीन पर रखना था, और वहां परीक्षण चलाना, तो यह शिकायत नहीं करेगा। लेकिन फिर, लोग इसे अपने उत्पादन में कैसे करते हैं? मुझे लगता है कि कुछ लोग इसी तरह के काम कर रहे हैं, 443 को कुछ वीएम से उलट दें जो केवल 80 चल रहे हों। यदि कोई बेहतर अभ्यास है, तो मैं इसे सीखना चाहता हूं और इसके बारे में सुनना चाहता हूं।
CppLearner

1
ब्राउज़र से मेरा HTTP ग्राहक का मतलब और सभी लोकप्रिय ग्राहकों के साथ POSTहो जाएगा GETअगर यह 301 या 302 निर्देशित कर दिये है। POST प्रॉक्सी रीडायरेक्ट पर POST रहेगा, लेकिन रीराइट पर नहीं।
c2h5oh

1
RFC2616 फिर से: 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.इसलिए अधिकांश ब्राउज़र एक चेतावनी संदेश देंगे, जैसा कि अन्य HTTP क्लाइंट के लिए मैं यह अनुमान भी नहीं लगा सकता कि उनका व्यवहार क्या होगा।
222 में c2h5oh

1

मैंने पाया POST /api/brandकि मुझे GET /api/brandजिस वेब एप्लिकेशन का उपयोग किया जा रहा था उसे चालू किया गया था ( flask-restful) एक "अमान्य" अनुरोध कर रहा था । अगर मैंने इस्तेमाल किया POST /api/brand/(अनुगामी नोटिस /), यह सफल रहा।


मैं डाक का उपयोग कर रहा था django बाकी-सामान्य लॉगिन का परीक्षण करने के लिए और वर्णित उसी समस्या को देख रहा था। कुंजी यह थी कि मैंने POST अनुरोध में अनुगामी '/' की उपेक्षा की थी।
स्टीव एल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.