প্রশ্ন Nginx বিপরীত প্রক্সি + URL পুনরায় লিখুন


Nginx পোর্ট 80 তে চলছে এবং আমি এটি ব্যবহার করে প্রক্সি URL গুলি বিপরীত করতে ব্যবহার করছি /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 টি পুনঃনির্দেশ (URL এ পরিবর্তন) কারণ করে, তবে আমি 301 চাই। আমার কী করা উচিত?


95
2018-04-15 17:31


উত্স


গ্রাফানার ক্ষেত্রে আপনার কোন সমস্যা থাকলে আপনাকে এই রেসিপি ব্যবহার করতে হবে: docs.grafana.org/installation/behind_proxy/... - mohsen saeedi


উত্তর:


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

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

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

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


118
2018-04-15 17:56



যখন আমি এটি করি তখন URL এ এখনও আমার অ্যাপ্লিকেশানে / foo দিয়ে শুরু হয় ... - jeffreyveon
একটি ভিন্ন সমস্যা হতে হবে। আমি মাত্র কয়েক মিনিট আগে সফলভাবে এই দৃশ্যকল্পটি পুনরুত্পাদন করেছি। মূল URL: HTTP: // উন্নয়ন / foo বিন্যাস / testme / 1234 - একটি পিএইচপি স্ক্রিপ্টের REQUEST_URI অপেরাতে প্রক্সি ব্যাক-এন্ড হিসাবে সংযুক্ত হচ্ছে: '/ testme / 1234' - Jens Bradler
Regex সম্ভবত হতে হবে /foo(.*)অন্যথায় example.com/foo মিলিত হবে না। (সম্ভবত যা জেফ্রেভিওন অভিজ্ঞ) - Benno
এই ধরনের কাজ, কিন্তু আমার শরীর আমি proxy_set_body সঙ্গে সেটিং করা হয় মুছে ফেলা হচ্ছে। - Justin Thomas
পুনরায় লিখুন /(।) /socket.io/ বিরতি; SOCETET.IO আমার দিন সংরক্ষণ করুন - user956584


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

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

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

থেকে Proxy_pass এ NGINX ডক্স:

যদি proxy_pass নির্দেশিকাটি একটি URI দিয়ে নির্দিষ্ট করা হয়, তবে যখন a   সার্ভারে অনুরোধ করা হয়েছে, একটি সাধারণ অনুরোধ URI অংশ   অবস্থানের সাথে মেলে এমন নির্দেশিত একটি URI দ্বারা প্রতিস্থাপিত হয়:


88
2017-09-29 03:30



আমার অবস্থান / অবস্থান / foo / যোগ করার চেয়ে আমার জন্য কাজ করে - Andrei N
এই ঠিক কি আমি খুঁজছেন ছিল! - anbiniyar
এটি একটি খুব পরিষ্কার সমাধান, আমি প্রশ্নটির ক্যানোনিকাল উত্তর হতে চাই। - ralien
পিছনে স্ল্যাশ রাখা বা অপসারণ গুরুত্ব বুঝতে খুব দীর্ঘ লাগলো। - Parvez
এই আসলে পাস হবে //xyz যদি আপনি যে হোস্ট করতে। - Archimedes Trajano


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

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

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

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

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

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


উল্লেখ ডকুমেন্টেশন:


31
2017-08-26 21:12



এই এখানে সেরা উত্তর! - Mo Friedrich
এটা দেখতে অনেকটা $args হারিয়ে যায়: http://frontend/foo?bar=baz প্রক্সি করা হবে http://backend/। নোটিশ ইউআরএল অংশ না লক্ষ্য করুন - Vanuan
@ ভানুয়ান, তুমি কি এ ব্যাপারে নিশ্চিত? আমি বেশ নিশ্চিত $args যদি আপনি উপরে কোডটি ব্যবহার করেন তবে সেগুলি আলাদাভাবে পরিচালনা করা উচিত $uri, এবং যদি আপনি আপনার মধ্যে সুস্পষ্ট ভেরিয়েবল ব্যবহার না করা পর্যন্ত, ফিরে একত্রিত করা উচিত proxy_pass। - cnst
@ আর্চিমিডেস ট্রাজানো, আপনি ভুল, কারণ বিশেষ হ্যান্ডলিং আছে /foo পুনঃনির্দেশিত করা /foo/, তাই, যদি আপনি ব্যাকএন্ডে অদ্ভুত কিছু করছেন না এমনকি /foo অনুরোধ এখনও উপরের কোড দিয়ে কাজ করবে। (এটি আসলেই উত্তরটির অংশ, বিটিডব্লিউ।) - cnst
এই সেরা উত্তর! এই আপ স্থানান্তর করা আবশ্যক। - phegde


চেষ্টা

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

অথবা

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

0
2018-01-21 16:20



আপনি যদি উপরের মত কনফিগার করা আবশ্যক কেন কিছু ব্যাখ্যা দিতে যদি এই উত্তর ভাল হবে। - masegaloeh
এই আসলে পাস হবে //xyz যদি আপনি যে হোস্ট করতে। - Archimedes Trajano