Nginx https পুনর্লিখন POST কে GET এ পরিণত করে


17

আমার প্রক্সি সার্ভারটি আইপি এ-তে চলে এবং লোকেরা আমার ওয়েব পরিষেবাতে এইভাবে অ্যাক্সেস করে। এনগিনেক্স কনফিগারেশন আইপি বি-তে ভার্চুয়াল মেশিনে পুনর্নির্দেশ করবে

আই এ-তে প্রক্সি সার্ভারের জন্য, আমার সাইটগুলিতে এটি উপলব্ধ

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- র পোস্ট অনুরোধ ফরোয়ার্ড করতে 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

ধন্যবাদ!

(এটি এনগিনেক্স ফোরামেও জিজ্ঞাসা করা হবে কারণ এটি একটি সমালোচক ব্লকার ...)

উত্তর:


8

এটি এনগিনেক্স নয়, এটি আপনার ব্রাউজার।

আরএফসি 2616 থেকে নোট:

আরএফসি 1945 এবং আরএফসি 2068 উল্লেখ করে যে ক্লায়েন্টকে পুনঃনির্দেশিত অনুরোধে পদ্ধতিটি পরিবর্তন করার অনুমতি নেই। তবে, বেশিরভাগ বিদ্যমান ব্যবহারকারী এজেন্ট প্রয়োগগুলি 302 এর সাথে আচরণ করে যেন এটি 303 টি প্রতিক্রিয়া, অবস্থানটিতে একটি জিইটি সম্পাদন করে [..]

এটি সমস্ত জনপ্রিয় ব্রাউজারগুলির জন্য সত্য এবং এটি সম্পর্কে আপনি কিছুই করতে পারবেন না।


@ c2h50h আমি বুঝতে পেরেছি যে এইচটিটিপি স্পেক কিছু অনুরূপ বলেছিল। তবে এনগিনেক্সে আমি কী করতে পারি? আমি বলতে চাচ্ছি এই একটি তুচ্ছ সেটআপ যেখানে একটি অভ্যন্তরীণ 80 পোর্টের এগিয়ে 443 মানুষ, কিন্তু এখনও তারা কি করতে পারেন PUT, POST, DELETE, GET। আমার আগের সেটআপে আমার সামনে ভিড় পরিবেশন করার জন্য এই অতিরিক্ত প্রক্সিটি ছিল না। আমার একই অভ্যন্তরীণ সার্ভারে (আমাদের পরীক্ষার সার্ভার) একই কনফিগারেশন ছিল। এটা ঠিক কাজ করে।
সিপ্পলিয়ারার

কিছুই নেই। এটি 100% ক্লায়েন্টের পক্ষে। যদি কোনও ওয়েবসভার, কোনও ওয়েবসভার, 301 বা 302 পুনর্নির্দেশের ফেরত দেয় তবে ক্লায়েন্টের পক্ষ থেকে, ব্রাউজারটি কোনও প্রকারের অনুরোধকে প্রতিস্থাপন করবে GET। কোনও সার্ভার-সাইড কনফিগারেশন বা কোনও HTTP শিরোনাম ফিরে আসেনি এটি historicalতিহাসিক কারণে (প্রারম্ভিক ব্রাউজারগুলি ভুল বোঝাবুঝির কারণে সেভাবে আচরণ করেছিল এবং এটি একটি ডি স্ট্যাক্ট স্ট্যান্ডার্ডে পরিণত হয়েছিল) like
c2h5oh

এক জন্য এটি আসলে একটি ব্রাউজার নয়। ঠিক আছে আপনি এটি ব্রাউজার বলতে পারেন কারণ এটি HTTP প্রোটোকল..ওকে ব্যবহার করে .. ঠিক আছে। তবে আবার, মনে হচ্ছে এটি কেবল তখনই ঘটে যখন আমি এই দ্বি-স্তর কনফিগারেশনটি করছিলাম। যদি আমি একই কনফিগারেশনটি সরাসরি অভ্যন্তরীণ মেশিনে রেখেছিলাম এবং সেখানে পরীক্ষা চালিয়ে যাই তবে এটি অভিযোগ করবে না। তবে আবার, লোকেরা কীভাবে তাদের প্রযোজনায় এটি করতে পারে? আমি ধরে নেব যে কিছু লোক একই কাজ করছে, 443 এর বিপরীতে কিছু ভিএম রয়েছে যা কেবল ৮০ চালাচ্ছে। যদি আরও ভাল অনুশীলন হয় তবে আমি এটি শিখতে এবং সে সম্পর্কে শুনতে চাই।
সিপ্পলিয়নার

1
ব্রাউজার দ্বারা আমি HTTP ক্লায়েন্টকে বোঝাতে চাইছিলাম এবং এটি 301 বা 302 পুনঃনির্দেশিত হলে সমস্ত জনপ্রিয় ক্লায়েন্টের সাথে POSTহয়ে যাবে GET। POST প্রক্সি পুনর্নির্দেশে POST থাকবে, তবে পুনর্লিখনের জন্য নয়।
c2h5oh

1
আরএফসি 2616 আবার: 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.সুতরাং বেশিরভাগ ব্রাউজারগুলি একটি সতর্কতা বার্তা পপআপ করবে, অন্যান্য এইচটিটিপি ক্লায়েন্টদের মতো আমি তাদের আচরণ কী হবে তাও অনুমান করতে পারি না।
c2h5oh

1

আমি দেখেছি POST /api/brandপরিণত হচ্ছে GET /api/brandকারণ ওয়েব অ্যাপ্লিকেশন আমি ব্যবহার হয়েছিল ( flask-restful) একটি "অবৈধ" অনুরোধ উপার্জন ছিল না। আমি যদি ব্যবহার করি POST /api/brand/(পিছনে লক্ষ্য করুন /), এটি সফল ছিল।


আমি পোস্টম্যানকে জাঙ্গো রেস্ট-আথ লগইন পরীক্ষার জন্য ব্যবহার করছিলাম এবং বর্ণিত একই সমস্যাটি দেখছিলাম। মূলটি হ'ল আমি পোস্টের অনুরোধে '/' এর পিছনে অগ্রাহ্য করেছি।
স্টিভ এল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.