Nginx বিপরীত প্রক্সি + ইউআরএল পুনর্লিখন


149

এনগিনেক্স ৮০ বন্দর চলমান রয়েছে এবং আমি /fooপোর্ট করার পথে প্রক্সি ইউআরএলগুলি উল্টাতে এটি ব্যবহার করছি 3200:

location /foo {
                proxy_pass http://localhost:3200;
                proxy_redirect     off;
                proxy_set_header   Host $host;
}

এটি দুর্দান্ত কাজ করে তবে বন্দরে আমার একটি আবেদন রয়েছে 3200, যার জন্য আমি প্রাথমিকটি /fooপ্রেরণ করতে চাই না । এটি হ'ল - আমি যখন অ্যাক্সেস করি তখন আমি http://localhost/foo/barকেবল /barঅ্যাপটির দ্বারা প্রাপ্ত পথ হতে চাই । তাই আমি উপরের অবস্থান ব্লকে এই লাইনটি যুক্ত করার চেষ্টা করেছি:

rewrite ^(.*)foo(.*)$ http://localhost:3200/$2 permanent;

এটি 302 পুনর্নির্দেশের কারণ (ইউআরএল পরিবর্তন) সৃষ্টি করে তবে আমি 301 চাই I আমার কি করা উচিত?


গ্রাফানার ক্ষেত্রে আপনার যদি কোনও সমস্যা হয় তবে আপনার এই রেসিপিটি ব্যবহার করা উচিত: ডকস.গ্রাফানা.আর.ইনস্টলেশন
বিহাইন্ড_প্রোসি /

উত্তর:


169

লোকালহোস্টে পুনর্নির্দেশের কোনও দূরবর্তী সিস্টেম (যেমন ক্লায়েন্টের ওয়েব ব্রাউজার) থেকে বোঝা যায় না। সুতরাং পুনরায় লেখার পতাকাগুলি স্থায়ী (301) বা পুনর্নির্দেশ (302) আপনার ক্ষেত্রে কার্যকর নয়।

স্বচ্ছ পুনর্লিখনের নিয়মটি ব্যবহার করে দয়া করে নিম্নলিখিত সেটআপ চেষ্টা করুন:

location  /foo {
  rewrite /foo/(.*) /$1  break;
  proxy_pass         http://localhost:3200;
  proxy_redirect     off;
  proxy_set_header   Host $host;
}

curl -iআপনার পুনর্লিখন পরীক্ষা করতে ব্যবহার করুন । নিয়মে খুব সূক্ষ্ম পরিবর্তন nginx একটি পুনর্নির্দেশ সম্পাদন করতে পারে।


1
আমি যখন এটি করি তখনই ইউআরএল পথটি আমার অ্যাপে /
ফু

অন্যরকম সমস্যা অবশ্যই থাকতে হবে। আমি কয়েক মিনিট আগে সফলভাবে এই দৃশ্যের পুনরুত্পাদন করেছি। আসল ইউআরএল: HTTP: // বিকাশ / foo / টেস্টমে / 1234 - অ্যাপাচি চলমান একটি পিএইচপি স্ক্রিপ্টের REQUEST_URI প্রক্সি ব্যাক-এন্ড হিসাবে সংযুক্ত: '/ টেস্টমে / 1234'
জেনস ব্র্যাডলার

9
রেজেক্স সম্ভবত হওয়া উচিত /foo(.*), অন্যথায় example.com/fooমিলবে না। (যা সম্ভবত জেফরিওয়াইনের অভিজ্ঞতা হয়েছে)
বেনো

এই ধরণের কাজ, তবে আমার দেহটি আমি প্রক্সি_সেট_বডি দিয়ে সেট করছি সরানো হচ্ছে।
জাস্টিন থমাস

পুনর্লিখন /(.*) /sket.io/ বিরতি; আমার দিন সকেটের জন্য সংরক্ষণ করুন.আইও
ব্যবহারকারী 95658484

122

আপনি যখনই প্রক্সি_পাস নির্দেশিকায় কোনও ইউআরআই নির্দিষ্ট করেন ততক্ষণ সরল অবস্থানের উপসর্গের মিলটি পুনর্লিখনের নিয়মটি ব্যবহার না করেই এর জন্য কাজ করে:

location /foo {
  proxy_pass http://localhost:3200/;
}

নির্দেশের /শেষে অতিরিক্তটি লক্ষ্য করুন proxy_pass। এনজিআইএনএক্স ম্যাচ করা উপসর্গটি ছড়িয়ে দেবে /fooএবং বাকীটি ইউআরআইতে ব্যাকএন্ড সার্ভারে পাস করবে /। অতএব, http://myserver:80/foo/barব্যাকএন্ডে পোস্ট হবে http://localhost:3200/bar

প্রক্সি_পাসে এনজিআইএনএক্স ডক্স থেকে :

যদি প্রক্সি_পাস নির্দেশটি কোনও ইউআরআই-এর সাথে নির্দিষ্ট করা থাকে, তবে সার্ভারের কাছে যখন কোনও অনুরোধটি পাস করা হয়, তখন অবস্থানটির সাথে মিলিত একটি স্বাভাবিক অনুরোধের ইউআরআই অংশটি নির্দেশে উল্লিখিত ইউআরআই দ্বারা প্রতিস্থাপন করা হয়:


12
আমি / অবস্থান / foo / to -তে যোগ করার চেয়ে আমার পক্ষে কাজ করে
Andrei N

এটি আমি যা খুঁজছিলাম অবিকল ছিল!
আনবিনিয়ার

6
এটি একটি খুব পরিষ্কার সমাধান, আমি এটিকে প্রশ্নের উত্তরীয় উত্তর হিসাবে পছন্দ করব।
রালিয়েন

2
ট্রেলিং স্ল্যাশ রাখার বা অপসারণের গুরুত্ব অনুধাবন করতে খুব দীর্ঘ সময় নিয়েছে।
পারভেজ

5
এটি //xyzযদি আপনি এটি করেন তবে এটি হোস্টের কাছে আসলেই যাবে ।
আর্কিমিডিজ ট্রাজানো

60

নিখুঁত সবচেয়ে সঠিক উপায় এবং সর্বোত্তম অনুশীলন সাধারণত নিম্নরূপ:

location /foo/ {
    proxy_pass http://localhost:3200/; # note the trailing slash!
}

  • পিছনের স্ল্যাশেরproxy_pass মারাত্মক গুরুত্বটি নোট করুন , যা স্বয়ংক্রিয়ভাবে $uriভেরিয়েবলটিকে /foo/সামনের প্রান্তে /ব্যাকএন্ডের সাথে সামঞ্জস্য করতে পরিবর্তিত করে । সুস্পষ্ট rewriteনির্দেশনার দরকার নেই ।

  • উপরন্তু, লক্ষ করুন যে, চিহ্ন /মধ্যেlocation পাশাপাশি বেশ গুরুত্বপূর্ণ - এটা ছাড়া, আপনি এক বিন্দু (যেমন, একটি পরিশ্রমী এ আপনার সাইটে অদ্ভুত সুদর্শন URL গুলি থাকার ঝুঁকি /fooenছাড়াও /foo/en)।

    উপরন্তু, চিহ্ন /মধ্যে locationদিয়ে proxy_passকিছু নিশ্চিত করে বিশেষ হ্যান্ডলিং , ডকুমেন্টেশন অনুযায়ী locationনির্দেশক, কার্যকরভাবে একটি অন্তর্নিহিত কারণ location = /foo {return 301 /foo/;}হিসাবে ভাল।

    সুতরাং, locationউপরের মত চলমান স্ল্যাশের সাথে একটি সংজ্ঞায়নের মাধ্যমে আপনি কেবল এটি সুনিশ্চিত করেন না যে স্ল্যাশ-কম প্রত্যয় ইউআরএলগুলি /fooenবৈধ হবে না, তবে এটিও যে /fooপিছনে স্ল্যাশ ছাড়াই কাজ করা অবিরত থাকবে।


রেফারেন্স ডকুমেন্টেশন:


দেখে মনে $argsহচ্ছে হারিয়ে গেছে: এর সাথে http://frontend/foo?bar=bazপ্রক্সি করা হবে http://backend/। লক্ষ করুন যে
আরগগুলি

@ ভানুয়ান, আপনি কি সে সম্পর্কে নিশ্চিত? আমি খুব নিশ্চিত $argsযে আপনি যদি উপরের কোডটি আলাদাভাবে ব্যবহার করেন তবে তারা যথাযথভাবে হ্যান্ডেল করা $uriউচিত, যদি না আপনি নিজের স্পষ্ট ভেরিয়েবল ব্যবহার করছেন তবে proxy_pass
সিএনএসটি

ওহ, আমি দেখছি আমি হোস্ট ভেরিয়েবল ব্যবহার করছি। এটা পাল্টা স্বজ্ঞাত।
ভানুয়ান

1
@ আর্কিমিডস ট্রাজানো, আপনি ভুল হয়ে গেছেন, যেহেতু /fooআপনাকে পুনর্নির্দেশের জন্য বিশেষভাবে পরিচালনা করা হচ্ছে /foo/, সুতরাং আপনি যদি ব্যাকএন্ডে কিছু অদ্ভুত কিছু না করেন তবে /fooঅনুরোধগুলি এখনও উপরের কোডটির সাথে কাজ করবে। (এটি ইতিমধ্যে
বিটিডাব্লু এর

3
এই সমাধানটি এই সমস্ত ফোরামে বিজয়ী হওয়ার জন্য "মনে হয়", তবে উত্তরের মধ্যেই এটি লক্ষ করা উচিত যে এনগিনেক্স ইউআরএল ইউআরএল ডিকোড করবে এবং ডিকোডেড ইউআরএলটিকে প্রক্সড সার্ভারে পাস করবে। সুতরাং আপনার URL টি URL টি এনকোডযুক্ত অংশ বহন করে তবে এই সমাধানটি কাজ করবে না।
কোডিং

1

চেষ্টা

location /foo {
    proxy_pass http://localhost:3200/;
    ....

অথবা

location ^~ /foo {
    proxy_pass http://localhost:3200/;
    ....

13
এই উত্তরটি ভাল হবে যদি আপনি কিছু ব্যাখ্যা দেন তবে কেন এটি উপরের মতো কনফিগার করা উচিত।
masegaloeh

এটি //xyzযদি আপনি এটি করেন তবে এটি হোস্টের কাছে আসলেই যাবে ।
আর্কিমিডিজ ট্রাজানো

1

@ তেরাবাক এখনও কোন উত্তর জবাব না দেওয়ার জন্য দুঃখিত।

আপনার লোকালহোস্ট ব্যবহার করা উচিত নয় কারণ আপনি হোস্ট ফাইলের সাথে কোনও সার্ভারে অ্যাপ্লিকেশন চলছে তা নির্ভর করে। স্থানীয় হোস্টটি 127.0.0.1 এ কেবল একটি ডিফল্ট অনুবাদ। আপনার কাছে এই হোস্ট ফাইলগুলি থাকা উচিত বলে উল্লেখ করার মতো কিছুই নেই। এটি থাকা খুব সাধারণ।

লুপব্যাক ইন্টারফেস থাকা আবার নির্ভর করতে অন্য একটি সাধারণ জিনিস তবে আপনি এখনও নেটওয়ার্কিং স্ট্যাকের লুপব্যাক ইন্টারফেসের উপর নির্ভরশীল। এই দুটি না পাওয়া খুব বিরল ঘটনা। আপনি যদি কখনও এই সম্পর্কে চিন্তা। কমপক্ষে ইউনিক্স / লিনাক্সে আপনার সকেটের বিকল্প রয়েছে। এটি নেটওয়ার্ক স্ট্যাকের লোকালহোস্টে পৌঁছানোর প্রয়োজনীয়তা দূর করবে। এই পদ্ধতির সাথে সতর্কতা অবলম্বন করুন কারণ হোস্ট ওএসে কার্যকর হওয়ার কয়েকটি কারণ রয়েছে। যেমন খোলা ফাইলের সংখ্যা ইত্যাদি

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.