কীভাবে স্ট্রিং প্যারামিটারগুলি Nginx সহ একটি প্রক্সি_পাসের মাধ্যমে ফরোয়ার্ড করা যেতে পারে?


114
upstream apache {
   server 127.0.0.1:8080;
}
server{
   location ~* ^/service/(.*)$ {
      proxy_pass http://apache/$1;
      proxy_redirect off;
   }
 }

উপরের স্নিপেট অনুরোধগুলি পুনর্নির্দেশ করবে যেখানে url অন্য সার্ভারে "পরিষেবা" স্ট্রিং অন্তর্ভুক্ত করে, তবে এতে কোয়েরি পরামিতি অন্তর্ভুক্ত নয়।

উত্তর:


163

থেকে proxy_pass ডকুমেন্টেশন:

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

যেহেতু আপনি টার্গেটে using 1 ব্যবহার করছেন, এনগিনেক্স আপনাকে ঠিক কী পাস করতে হবে তা বলতে নির্ভর করে। আপনি এটি দুটি উপায়ে স্থির করতে পারেন। প্রথমত, একটি প্রক্সি_পাস দিয়ে ইউরির শুরুটি কেটে ফেলা তুচ্ছ:

location /service/ {
  # Note the trailing slash on the proxy_pass.
  # It tells nginx to replace /service/ with / when passing the request.
  proxy_pass http://apache/;
}

অথবা আপনি যদি রেজেক্স অবস্থানটি ব্যবহার করতে চান তবে কেবল আরোগুলি অন্তর্ভুক্ত করুন:

location ~* ^/service/(.*) {
  proxy_pass http://apache/$1$is_args$args;
}

1
আমি বিশ্বাস করি না আপনি পরবর্তীটি করতে পারেন। আমি চেষ্টা করেছি এবং এনজিনেক্স আমার কাছে অভিযোগ করেছে।
duma

3
অভিযোগ কীভাবে? আমি এটি কেবলমাত্র এনজিএনক্স ১.৩.৪ এ পরীক্ষা করেছি এবং এটি আমার পক্ষে ভাল কাজ করেছে।
কলবিজ্যাক

হুম .. আমি এখনই মনে করতে পারি না :( তবে আমার মনে হয় এটি "~ *" এর সাথে সম্পর্কিত হতে পারে। তবে আমি সবেমাত্র যাচাই করেছিলাম এবং আমার এনজিনেক্স ১.২.৩ (হোমব্রুয়ের মাধ্যমে) রয়েছে। সম্ভবত এটি তাই?
duma

"প্রক্সি_ডাইরেক্ট ডিফল্ট" ভেরিয়েবলগুলির সাথে "প্রক্সি_পাস" নির্দেশিকা ব্যবহার করা যাবে না
জিন-ফিলিপ কারুয়ানা

1
পুনর্লিখন ব্যবহার করতে হবে location /service/ { rewrite ^\/service\/(.*) /$1 break; proxy_pass http://apache; }
অ্যান্ড্রু আর্নাউতভ

27

আমি এর ~পরিবর্তে কলবিজ্যাকের দ্বিতীয় পদ্ধতির কিছুটা পরিবর্তিত সংস্করণ ব্যবহার করি ~*

location ~ ^/service/ {
  proxy_pass http://apache/$uri$is_args$args;
}

10

আমি @ কলবিজ্যাক কোডটি এর জন্য কাজ করার জন্য পরিবর্তন করেছি

http://website1/service
http://website1/service/

পরামিতি সহ

location ~ ^/service/?(.*) {
    return 301 http://service_url/$1$is_args$args;
}

1
মনে রাখবেন এটি সার্ভার পুনর্নির্দেশের আগে ক্লায়েন্টের 301 প্রতিক্রিয়া ফিরিয়ে দেবে। proxy_passনির্দেশ উপরে সার্ভার প্রান্তের উপর ফেরৎ না।
লুক পিটারসন

1
আপনার ক্যোয়ারি প্যারামিটারগুলিতে ইউআরএল (%) এনকোডযুক্ত অক্ষর থাকলে এটি ভঙ্গ হবে। পরিবর্তে অ্যান্ড্রু এর উত্তর ব্যবহার করুন।
ডেভিড ওয়েবার

9

এখানে প্রক্সি_পাস ব্যবহার করে প্যারামগুলি পাস করতে আপনাকে পুনর্লিখন ব্যবহার করতে হবে উদাহরণস্বরূপ আমি এস 3 এ অ্যাঙ্গুলার অ্যাপ্লিকেশন স্থাপনার জন্য করেছি

এস 3 স্ট্যাটিক ওয়েবসাইট হোস্টিং রুট সমস্ত সূচকে সূচক। Html

আপনার প্রয়োজন হিসাবে গৃহীত কিছু হবে

location /service/ {
    rewrite ^\/service\/(.*) /$1 break;
    proxy_pass http://apache;
}

আপনি যদি http://127.0.0.1:8080/query/params/ এ শেষ করতে চান

আপনি যদি http://127.0.0.1:8080/service/query/params/ এ শেষ করতে চান তবে আপনার মতো কিছু দরকার হবে

location /service/ {
    rewrite ^\/(.*) /$1 break;
    proxy_pass http://apache;
}

1
দেখে মনে হচ্ছে এটি পথের প্যারামগুলি ( /path/params) ভালভাবে পরিচালনা করে তবে প্যারামগুলি ( ) কোয়েরি করে না ?query=params?
উইল

আহ না, আমার ভুল, ক্যোয়ারী প্যারামিটারগুলি স্বয়ংক্রিয়ভাবে যুক্ত করা উচিত (সেগুলি আমার পরীক্ষায় রয়েছে)।
উইল

2

গিথুব গিস্ট https://gist.github.com/anjia0532/da4a17f848468de5a374c860b17607e7

#set $token "?"; # deprecated

set $token ""; # declar token is ""(empty str) for original request without args,because $is_args concat any var will be `?`

if ($is_args) { # if the request has args update token to "&"
    set $token "&";
}

location /test {
    set $args "${args}${token}k1=v1&k2=v2"; # update original append custom params with $token
    # if no args $is_args is empty str,else it's "?"
    # http is scheme
    # service is upstream server
    #proxy_pass http://service/$uri$is_args$args; # deprecated remove `/`
    proxy_pass http://service$uri$is_args$args; # proxy pass
}

#http://localhost/test?foo=bar ==> http://service/test?foo=bar&k1=v1&k2=v2

#http://localhost/test/ ==> http://service/test?k1=v1&k2=v2

1

ক্যোয়ারী স্ট্রিং ছাড়াই পুনর্নির্দেশের জন্য শোনার পোর্ট লাইনের অধীনে সার্ভার ব্লকের লাইনের নিচে যুক্ত করুন:

if ($uri ~ .*.containingString$) {
           return 301 https://$host/$uri/;
}

ক্যারি স্ট্রিং সহ:

if ($uri ~ .*.containingString$) {
           return 301 https://$host/$uri/?$query_string;
}

1
Nginx ডকুমেন্টেশনটি ifসম্ভব হলে ব্যবহার এড়াতে স্পষ্ট । এই ক্ষেত্রে, সমাধানটি অন্য উত্তরে locationদেখানো হিসাবে সঠিকভাবে হতে পারে ।
অ্যান্ড্রেস মোরালেস

2
যাইহোক এটির একটি অপূর্ণতা থাকলেও আরও একটি সমাধান আরও ভাল
দিমিত্রি মালুগিন

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