এনজিআইএনএক্সে প্রক্সি প্রতিক্রিয়ায় আমি কীভাবে ইউআরএলগুলি পুনরায় লিখব


87

আমি Mod_proxy_html দিয়ে অ্যাপাচি ব্যবহার করতে অভ্যস্ত এবং এনজিআইএনএক্স এর সাথে অনুরূপ কিছু অর্জন করার চেষ্টা করছি। নির্দিষ্ট ব্যবহারের কেসটি হ'ল আমার কাছে অ্যাডমিন ইউআই চলছে টমক্যাটটিতে 8080 বন্দরটিতে একটি সার্ভারে মূল প্রসঙ্গে:

http://localhost:8080/

আমার এটি 80 পোর্টে ভেসে উঠতে হবে, তবে এনজিআইএনএক্স সার্ভারে এই হোস্টটিতে চলতে থাকা আমার অন্যান্য প্রসঙ্গ রয়েছে, তাই এখান থেকে চেষ্টা করে অ্যাক্সেস করতে চাই:

http://localhost:80/admin/

আমি আশা করছিলাম যে নীচের সুপার সিম্পল সার্ভার ব্লকটি এটি করবে তবে এটি যথেষ্ট নয়:

server {
    listen  80;
    server_name screenly.local.akana.com;

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

সমস্যাটি হ'ল প্রত্যাশিত সামগ্রীতে (এইচটিএমএল) স্ক্রিপ্টগুলিতে ইউআরএল এবং স্টাইলের তথ্যগুলি সমস্ত মূল প্রসঙ্গে অ্যাক্সেস করা থাকে, সুতরাং / URL এর পরিবর্তে / অ্যাডমিন / দিয়ে শুরু করতে এই ইউআরএলগুলি পুনরায় লেখার দরকার আমার।

এনজিআইএনএক্স এ আমি কীভাবে করব?

উত্তর:


128

আমাদের প্রথমে প্রক্সি_পাসে ডকুমেন্টেশন সাবধানে এবং সম্পূর্ণভাবে পড়া উচিত ।

ইউআরআই আপস্ট্রিম সার্ভারে পাস হয়েছে "প্রক্সি_পাস" নির্দেশটি ইউআরআইয়ের সাথে ব্যবহৃত হয়েছে কিনা তার ভিত্তিতে নির্ধারিত হয়। প্রক্সি_পাস নির্দেশিকায় স্ল্যাশকে অনুসরণ করার অর্থ ইউআরআই উপস্থিত এবং সমান /। পিছনে স্ল্যাশের অনুপস্থিতির অর্থ হ্যাট ইউআরআই অনুপস্থিত।

ইউআরআই সহ প্রক্সি_পাস :

location /some_dir/ {
    proxy_pass http://some_server/;
}

উপরের সাথে, নিম্নলিখিত প্রক্সি রয়েছে:

http:// your_server/some_dir/ some_subdir/some_file ->
http:// some_server/          some_subdir/some_file

মূলত, /some_dir/দ্বারা প্রতিস্থাপিত পরার /থেকে অনুরোধ পথ পরিবর্তন করতে /some_dir/some_subdir/some_fileকরতে /some_subdir/some_file

ইউআরআই ছাড়াই প্রক্সি_পাস :

location /some_dir/ {
    proxy_pass http://some_server;
}

দ্বিতীয় (কোনও পিছনে স্ল্যাশ নেই) সহ: প্রক্সিটি এরকম হয়:

http:// your_server /some_dir/some_subdir/some_file ->
http:// some_server /some_dir/some_subdir/some_file

মূলত, সম্পূর্ণ আসল অনুরোধের পথটি পরিবর্তন ছাড়াই চলে passed


সুতরাং, আপনার ক্ষেত্রে, মনে হচ্ছে আপনি যা চান তা পেতে কেবল পিছনের স্ল্যাশটি ফেলে দেওয়া উচিত।


গুহা

নোট করুন যে স্বয়ংক্রিয় পুনর্লিখন কেবল তখনই কাজ করে যদি আপনি প্রক্সি_পাসে ভেরিয়েবল ব্যবহার না করেন। আপনি যদি ভেরিয়েবলগুলি ব্যবহার করেন তবে আপনার নিজেরটি আবার লিখতে হবে:

location /some_dir/ {
  rewrite    /some_dir/(.*) /$1 break;
  proxy_pass $upstream_server;
}

আবার এমন কিছু মামলা রয়েছে যেখানে পুনর্লিখন কাজ করবে না, এজন্য ডকুমেন্টেশন পড়া আবশ্যক।


সম্পাদনা করুন

আপনার প্রশ্নটি আবার পড়ে, মনে হচ্ছে আমি মিস করেছি যে আপনি কেবল এইচটিএমএল আউটপুট সম্পাদনা করতে চান।

তার জন্য, আপনি সাব - ফিল্টার নির্দেশিকা ব্যবহার করতে পারেন । কিছুটা এইরকম ...

location /admin/ {
    proxy_pass http://localhost:8080/;
    sub_filter "http://your_server/" "http://your_server/admin/";
    sub_filter_once off;
}

মূলত, আপনি যে স্ট্রিংটি প্রতিস্থাপন করতে চান তা এবং প্রতিস্থাপনের স্ট্রিং


4
ধন্যবাদ, যে অনেক সাহায্য করে। আমি মনে করি সাব_ফিল্টার এটি করবে।
ইয়ানজি

4
আমি কৌতুহলী আছি যে এনগিনেক্স ইতিমধ্যে আউটপুটটি পুনরায় লিখছে, এটি কি সর্বনিম্ন লিঙ্কগুলিতে হোস্ট / হোস্টনামটি আবার লিখতে হবে না? সুতরাং উদাহরণস্বরূপ, আপনি নাsub_filter "http://localhost/" "http://localhost/admin/"
থারস্মমনার

4
মাইমটাইপ ব্যতীত অন্য text/htmlলেখার অনুমতি দেওয়ার জন্য আমাকেও যুক্ত করতে হয়েছিল sub_filter_types *;
anttikoo

এই সমাধানটি নিয়ে আমার জন্য কিছু অদ্ভুত ঘটনা ঘটছে। সংস্থানসমূহ (* .js, * .css ইত্যাদি প্রাপ্ত হচ্ছে) তবে পৃষ্ঠাটি লোড হতে ব্যর্থ হয়েছে। আমি প্রক্সিপাস চলাকালীন http://your_server/admin/সমাধান হওয়ার আশা http://your_serverকরব তবে এটি react-router /admin/ location did not match any routesআমার অ্যাপ্লিকেশনটিতে '/ অ্যাডমিন' সম্পর্কে কিছুই জানে না বলে আমার অ্যাপ্লিকেশনটিতে ত্রুটি ঘটেছে।
প্রচি

আপনাকে proxy_redirectনির্দেশিকাও যুক্ত করতে হবে যাতে Locationপ্রতিক্রিয়ার মাধ্যমে প্রেরিত শিরোনামটিও ইউআরএল অনুসারে সংশোধিত হতে পারে। এই টিউটোরিয়ালটি দেখুন: cyberciti.biz/faq/…
ভিভনভ

22

আপনার ডেটা সংকোচনের সাথে ব্যাকএন্ড-সার্ভারগুলির জন্য প্রথম "সাব_ফিল্টার" এর আগে সেট করতে আপনাকে নিম্নলিখিত নির্দেশের প্রয়োজনও হতে পারে:

proxy_set_header Accept-Encoding "";

অন্যথায় এটি কাজ নাও করতে পারে। আপনার উদাহরণের জন্য এটি দেখতে পাবেন:

location /admin/ {
    proxy_pass http://localhost:8080/;
    proxy_set_header Accept-Encoding "";
    sub_filter "http://your_server/" "http://your_server/admin/";
    sub_filter_once off;
}

-1

আপনি নিম্নলিখিত nginx কনফিগারেশন উদাহরণ ব্যবহার করতে পারেন:

upstream adminhost {
  server adminhostname:8080;
}

server {
  listen 80;

  location ~ ^/admin/(.*)$ {
    proxy_pass http://adminhost/$1$is_args$args;
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Host $server_name;
  }
}

4
কেন এই নিম্নমানের? কোড নিয়ে কোন সমস্যা? আমার কাছে একটি দুর্দান্ত এবং জটিল সমাধানের মতো বলে মনে হচ্ছে, এমন একটি অ্যাপ্লিকেশন প্রক্সিংয়ের কিছু সতর্কতামূলক সমাধান যা পরে পপ আপ হয়। proxy_redirect off;যদিও নিশ্চিত না । আমি যোগ করতে চাই proxy_set_header X-Forwarded-Proto $scheme;
LuH
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.