এনগিনেক্স প্রক্সিতে ইউআরএল ডিকোডিং অক্ষম করা হচ্ছে


21

যখন আমি এই URL টি ব্রাউজ করি: http://localhost:8080/foo/%5B-%5Dসার্ভার ( nc -l 8080) এটি হিসাবে রয়েছে:

GET /foo/%5B-%5D HTTP/1.1

তবে আমি যখন এই অ্যাপ্লিকেশনটিকে এনজিঙ্ক্সের মাধ্যমে প্রক্সি করি (1.1.19):

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

একই অনুরোধটি এনজিনেক্স বন্দরের মাধ্যমে পাঠানো হয়েছে ডিকোড করা পথের সাথে প্রেরণ করা হয়েছে:

GET /foo/[-] HTTP/1.1

জিইটি পাথের ডিকোডেড স্কোয়ার ব্র্যাকেটগুলি অচল অবস্থায় পৌঁছানোর সাথে সাথে টার্গেট সার্ভারে ত্রুটি ঘটায় ( HTTP অবস্থা 400 - পথে অবৈধ চরিত্র ... )।

ইউআরএল ডিকোডিং অক্ষম করার বা এটিকে আবার এনকোড করার কোনও উপায় আছে যাতে এনজিনেক্সের মাধ্যমে রুট করার সময় লক্ষ্য সার্ভারটি ঠিক একই পাথটি পায়? কিছু চালাক ইউআরএল পুনর্লিখনের নিয়ম?


উত্তর:


19

ভ্যালেন্টিন ভি ভি বার্তেনিভের উদ্ধৃতি (এই উত্তরটির পুরো কৃতিত্ব কাদের পাওয়া উচিত):

ডকুমেন্টেশন থেকে একটি উদ্ধৃতি :

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

  • যদি ইউআরআই ব্যতীতproxy_pass নির্দিষ্ট করা থাকে , তবে একটি অনুরোধ ইউআরআই একই অনুরোধে সার্ভারের কাছে পাঠানো হবে যেমন কোনও ক্লায়েন্টের দ্বারা প্রেরণ করা হয়েছিল যখন কোনও মূল অনুরোধ প্রক্রিয়া করার সময়

আপনার ক্ষেত্রে সঠিক কনফিগারেশনটি হ'ল:

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

8
আমার মতো পরিস্থিতি কারওর ক্ষেত্রেই আমাকে বদলাতে http://localhost:8080/হয়েছিল http://localhost:8080
হার্টিম

4
এনগিনেক্স কেন ইউআরআইটিকে ব্যাকএন্ড সার্ভারে পাস করার আগে ডিকোড করে? এটি যদি ইউআরআইকে অদৃশ্য রাখে তবে কী আরও বোঝাতে হবে না?
প্লাটিপাস

@ প্লাটিপাস, আপনি স্পষ্টভাবে প্রতিস্থাপনগুলি সম্পাদন না করা অবধি এটিকে অপরিচ্ছন্ন রাখা হবে
সিএনএসটি r এপ্রিল'১১ 21

2

মনে রাখবেন যে ইউএনএল ডিকোডিং, সাধারণত এনজিনেক্সের ডকুমেন্টেশনের মধ্যে $uri"নরমালাইজেশন" হিসাবে পরিচিত , ব্যাকএন্ডের আইএফএফের আগে ঘটে:

  • হয় যে কোনও ইউআরআই proxy_passনিজের মধ্যে নির্দিষ্ট করা আছে , এমনকি কেবল পিছনে পিছনে সমস্ত নিজেই স্ল্যাশ করলেও

  • বা, ইউআরআই প্রক্রিয়াজাতকরণের সময় পরিবর্তিত হয়, উদাহরণস্বরূপ, এর মাধ্যমে rewrite


উভয় শর্তাবলী স্পষ্টতই নথিভুক্ত করা হয়েছে http://nginx.org/r/proxy_pass (জোর খনি):

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

  • যদি কোনও ইউআরআই ছাড়াইproxy_pass নির্দিষ্ট করা থাকে , অনুরোধটি ইউআরআই একই অনুরোধে সার্ভারের কাছে পাঠানো হয় যেমন কোনও ক্লায়েন্ট প্রেরণ করা হয় যখন মূল অনুরোধটি প্রক্রিয়া করা হয়, বা পরিবর্তিত ইউআরআই প্রক্রিয়াকরণের সময় সম্পূর্ণ স্বাভাবিক অনুরোধ ইউআরআই পাস হয়


সমাধানটি হয় ওপিএস ক্ষেত্রে যেমন ইউআরআই বাদ দেওয়া, বা প্রকৃতপক্ষে একটি চতুর rewriteনিয়ম ব্যবহার করা হয় :

# map `/foo` to `/foo`:
location /foo {
    proxy_pass  http://localhost:8080;  # no URI -- not even just a slash
}

# map `/foo` to `/bar`:
location /foo {
    rewrite  ^  $request_uri;            # get original URI
    rewrite  ^/foo(/.*)  /bar$1  break;  # drop /foo, put /bar
    return 400;   # if the second rewrite won't match
    proxy_pass    http://localhost:8080$uri;
}

আপনি এটি নিয়ন্ত্রণ গ্রুপ সহ সম্পর্কিত স্ট্যাক ওভারফ্লো উত্তরে লাইভ দেখতে পাচ্ছেন


ডকুমেন্টেশন এখানে বিভ্রান্ত হয়। উভয় ফর্মের মধ্যে একটি ইউআরআই থাকে। এটি সেই পথের উপাদান যা একটিতে উপস্থিত এবং অন্যটিতে অনুপস্থিত।
মাইকেল হ্যাম্পটন

@ মিশেলহ্যাম্পটন, আমি একমত নই - প্যাথটিকে সাধারণত ইউআরআই বলা হয়, সুতরাং, পথ ছাড়া যেটিকে ইউআরআই থাকে না।
সিএনএসটি

একাকী কোনও আপেক্ষিক পথ অবশ্যই একটি বৈধ URL হতে পারে। মুল বক্তব্যটি হল, বাকীটিও একটি বৈধ ইউআরআই (যেমন http://localhost:8080)। আপনি যদি অসম্মতি, আপনি এটা পর্যন্ত সময় লাগতে পারে জন্য RFC 3986. লেখক সঙ্গে
মাইকেল হ্যাম্পটন

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