কীভাবে স্ট্রিং প্যারামিটারগুলি 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.