কীভাবে একটি এনগিনেক্স প্রক্সি_পাস দিয়ে পাথ সরিয়ে ফেলা যায়


77

আমার একটি চলমান ওয়েব-অ্যাপ্লিকেশন রয়েছে http://example.com/এবং একটি পৃথক সার্ভারে অন্য একটি অ্যাপ্লিকেশন "মাউন্ট" করতে চাই http://example.com/en। আপস্ট্রিম সার্ভারগুলি এবং proxy_passকাজ করছে বলে মনে হচ্ছে তবে একটি ইস্যুতে:

upstream luscious {
 server lixxxx.members.linode.com:9001;
}

server {
  root /var/www/example.com/current/public/;
  server_name example.com;

  location /en {
    proxy_pass http://luscious;
  }
}

খোলার সময় example.com/en, আমার উজানের অ্যাপ্লিকেশনটি ফিরে আসে 404 not found /en। এটি বোধগম্য হয়, যেহেতু উজানের কোনও পথ নেই /en

কি proxy_pathঅধিকার সমাধান? আমি কি "উজানের" পুনর্লিখন করব যাতে এটি /enপরিবর্তিত হয়ে শিকড়ের পথ হিসাবে শোনে ? বা এমন কোনও নির্দেশনা আছে যা আমাকে উজানের পাশ দিয়ে যে পথটি আবার লিখতে দেয়?

উত্তর:


133

কোনও নিয়মিত অভিব্যক্তি ব্যবহার না করে আপনি যা চান তা করার সম্ভবত এটি সবচেয়ে কার্যকর উপায়:

location = /en {
    return 302 /en/;
}
location /en/ {
    proxy_pass http://luscious/;  # note the trailing slash here, it matters!
}

1
যতদূর আমি জানি, শেষ অংশটি এখনও "/ en" প্রক্সিটির পথে যেতে পারত, না?
Berkes

15
@ বার্কস, না, এটি হবে না - পিছনের স্ল্যাশ proxy_passহ'ল যা তারতম্য । এছাড়াও, এই উত্তরটি আপনি যেটির সাথে এসেছেন তার চেয়ে আরও সঠিক, কারণ এটি এটি নিশ্চিত করে যে এটি proxy_redirectস্থির থাকে default, সুতরাং, আপনি এখনও 302আপনার ব্যাকএন্ডের মধ্যে এটি ব্যবহার করতে পারেন , এবং এটি সর্বত্র সঠিকভাবে কাজ করতে পারেন।
সিএনএসটি

4
আহ, আমি পিছনের
স্ল্যাশটি

3
AAARGH! প্রশিক্ষণ স্ল্যাশ!
ব্যারিম্যাক 26'17

4
3 ঘন্টা অনুসন্ধান, এবং হ্যাঁ ... এটি ছিল পিছনের স্ল্যাশ। ধন্যবাদ বন্ধু!
লুকাস পি।

12

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

location ~ ^/en(/?)(.*)$ {  # OOPS!
  proxy_pass http://luscious/$2$is_args$args;  # OOPS!
}

সমাধানটি প্রথম নজরে আরও সুন্দর মনে হতে পারে তবে একাধিক কারণে এটি ভুল।

  • উপরের রেজেক্স একটি অনুরোধ ইউরির সাথে মিলবে /enjoy, এটি /joyপ্রবাহে পুনর্নির্দেশ করবে । এটি কি আসলেই উদ্দেশ্যযুক্ত?

  • অনুরোধের /enফলে কোনও পুনঃনির্দেশের ফলস্বরূপ ফল পাওয়া যাবে না, সরাসরি /প্রবাহ থেকে সরাসরি একটি পরিবেশনা করা (প্রায়শই যদি অনুরোধের /en/পরিবর্তে অনুরোধ করা হয়েছিল তবে যথেষ্ট নয়)। আপনি যদি আপনার মূল পৃষ্ঠের উপরের প্রান্তের মধ্যে আপেক্ষিক ইউআরআই ব্যবহার করেন (অন্যথায়, উজানের ইউআরআই-এর ভিতরে আপনার উপসাগরটি কেন থাকবে না /en/?), যেমন src="style.css"( উদাহরণস্বরূপ কোনও ভাষা-নির্দিষ্ট উল্লেখ করতে পারে url("menu.png")), তবে ব্রাউজারটি অনুরোধ করবে যেমন /style.cssপরিবর্তে /en/style.css। (অথবা আপনি সর্বত্র নিখুঁত ইউআরআই ব্যবহার করলেও, যদি কেউ অপ্রত্যাশিত অর্ধ-alচ্ছিক সংস্থান তুলনামূলকভাবে উল্লেখ করে তবে কী হবে?) ওফ, হঠাৎ সাইটটি কাজ করতে পারে না, তবে কেবল কখনও কখনও বা প্রান্তিক ক্ষেত্রে in

  • ওপীর নিজস্ব উত্তরে ইতিমধ্যে উল্লিখিত অন্য একটি প্রশ্নের আমার আগের পরামর্শ অনুসারে , নিয়মিত অভিব্যক্তি ব্যবহার proxy_redirectনির্দেশকে ডিফল্ট মান রাখার পরিবর্তে defaultএটিকে offপরিবর্তিত করে প্রতিরোধ করে। এর অর্থ হ'ল যদি কোনও প্রবাহের Location: http://127.0.0.1:8080/en/dir/জন্য অনুরোধ করা /en/dirহয় যখন প্রবাহের জবাব দেওয়া হয় , তবে ক্লায়েন্ট দেখতে পাবেন যা স্পষ্টতই সঠিকভাবে কাজ করবে না। (কোন /enঅনুরোধের জন্য বিশেষত বিদ্রূপাত্মক হয়ে উঠবে যা রেগেক্সকে প্রথম স্থানে ব্যবহারের অনুরোধ জানায়, তবুও এই নির্দিষ্ট প্রয়োগটি ইতিমধ্যে উল্লিখিত হিসাবে অন্য একটি সমস্যায় ভুগছে।) এছাড়াও, আপনি যদি ইতিমধ্যে ব্যবহার করছেন তবেupstreamদিকনির্দেশক, তবে এটি অতিরিক্ত কদর্য পেতে পারে যদি আপনি কেবল একটি কাস্টম একের সাথে যাওয়ার চেষ্টা করেন, বিশেষত যদি আপনার একাধিক আপস্ট্রিম সার্ভার থাকতে পারে - proxy_redirectতবে এর প্রত্যেকটির জন্য আলাদা আলাদা কীভাবে থাকতে পারেন ? আপনি proxy_redirectখুব সহজেই কোনও অভ্যন্তরের সাথে মেলে এমনকি নিয়মিত ভাব প্রকাশ করতে পারেন তবে আপনি যদি ভবিষ্যতে ক্রস-ডোমেন পুনর্নির্দেশ করার সিদ্ধান্ত নেন?

উপরের কয়েকটি বিষয়কে একটি একক রেজেক্স-ভিত্তিক অবস্থানের সাথে সম্বোধনের চেষ্টা করার জন্য আমরা নিম্নলিখিতগুলি করতে পারলাম (নোট করুন যে proxy_passআমাদের আরও upstreamভিত্তিযুক্ত নির্দেশিকা থেকে একটি সার্ভারের রেফারেন্সটি proxy_redirectআরও সহজবোধ্য করতে হবে ):

location ~ ^/en/?((?<=/).*)?$ {
  location = /en { return 302 /en/; }
  proxy_pass http://127.0.0.1:8080/$1$is_args$args;
  proxy_redirect http://127.0.0.1:8080/ /en/;
}

সুতরাং, আপনি যদি আমাকে জিজ্ঞাসা করেন তবে দুটি সহোদর শীর্ষ-স্তরের অবস্থানের সাথে মূল সমাধানটি তার পরিবর্তে রেজেক্স রুটে গিয়ে খরগোশের গর্তে নিজেকে খননের চেয়ে আরও ভাল ধারণা হবে।


এটি একটি ব্যতিক্রম ঘটায়:nginx: [emerg] location "/en" is outside location "^/en/?((?<=/).*
অ্যাথলান

1
@ অ্যাথলান, কারণ এটি আপনাকে প্রথম স্থানে ব্যবহার করা উচিত নয়! আপনি যদি এখনও চান, আপনি সেই স্থানটি রেজিপক্সের বাইরে রাখতে পারেন।
সিএনএসটি

লোকালেশন লাগানো = / en বাইরে কাজ করে সত্যিই ভাল! ধন্যবাদ
সেবাস্তিয়ান ওয়েবার

7

সুতরাং, আমি উত্তরটি স্ট্যাকওভারফ্লোতে পেয়েছি :

upstream luscious {
 server lixxxx.members.linode.com:9001;
}

server {
  root /var/www/example.com/current/public/;
  server_name example.com;

  location ~ ^/en(/?)(.*) {
    proxy_pass http://luscious/$2;
  }
}

মূলত: লোকেশনটিতে একটি রেজেক্স পাস করা এবং প্রক্সি_পাস ইউআরএলকে ব্যাকরেফটি পাস করা।


আমার মনে হয় "প্রক্সি_পাস লুসিয়াস / $ ;" হবে "proxy_pass আনন্দদায়ক / $ 2 "
Zafer

1
@ জাফর ঠিক বলেছেন, উপরের উত্তরটি আমাকে একটি ত্রুটি দিচ্ছিল
স্পষ্টভাবে

আমি উত্তরটি পরিবর্তন করেছি, তবে হাতে কোনও সার্ভার নেই যেখানে আমি এটি এটিএম চেষ্টা করতে পারি, তাই এটি যাচাই করা হয়নি।
বার্কস

0

Nginx নথিতে অ্যাকাউন্টিং

এইচটিটিপি প্রক্সাইড সার্ভারে একটি অনুরোধ পাস করার জন্য, প্রক্সি_পাস নির্দেশিকা একটি অবস্থানের মধ্যে নির্দিষ্ট করা আছে। উদাহরণ স্বরূপ:

location /some/path/ {
    proxy_pass http://www.example.com/link/;
}

এই উদাহরণের কনফিগারেশনটির ফলে এই অবস্থানটিতে প্রক্রিয়াকৃত সমস্ত অনুরোধগুলি নির্দিষ্ট ঠিকানায় প্রক্সিড সার্ভারে প্রেরণ করা হয়। এই ঠিকানাটি একটি ডোমেন নাম বা একটি আইপি ঠিকানা হিসাবে নির্দিষ্ট করা যেতে পারে। ঠিকানার মধ্যে একটি বন্দরও অন্তর্ভুক্ত থাকতে পারে:

location ~ \.php {
    proxy_pass http://127.0.0.1:8000;
}

নোট করুন যে উপরের প্রথম উদাহরণে, প্রক্সিড সার্ভারের ঠিকানাটি একটি ইউআরআই, / লিঙ্ক / দ্বারা অনুসরণ করা হয়। যদি ঠিকানার সাথে ইউআরআই নির্দিষ্ট করা থাকে তবে এটি অনুরোধ ইউআরআইয়ের অংশটি প্রতিস্থাপন করে যা অবস্থানের প্যারামিটারের সাথে মেলে। উদাহরণস্বরূপ, এখানে /some/path/page.html ইউআরআই এর সাথে অনুরোধটি http://www.example.com/link/page.html এ প্রক্সি করা হবে । যদি ঠিকানাটি কোনও ইউআরআই ছাড়াই নির্দিষ্ট করা থাকে, বা ইউআরআই-র অংশটি প্রতিস্থাপন করা নির্ধারণ করা সম্ভব না হয়, সম্পূর্ণ অনুরোধ ইউআরআই পাস হয়েছে (সম্ভবত, সংশোধিত)।

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