প্রক্সি, পুনর্লিখন এবং সংরক্ষণ URL এর মাধ্যমে এনগিনেক্স পুনর্নির্দেশ


71

এনগিনেক্সে আমরা নিম্নলিখিত হিসাবে একটি ইউআরএল পুনর্নির্দেশের চেষ্টা করছি:

http://example.com/some/path -> http://192.168.1.24

যেখানে ব্যবহারকারীরা এখনও তাদের ব্রাউজারে মূল URL টি দেখতে পান। ব্যবহারকারী পুনঃনির্দেশিত হয়ে গেলে, তারা লিঙ্কটিতে ক্লিক করুন বলে /section/index.html, আমরা এটি পুনর্নির্দেশের দিকে পরিচালিত করে এমন একটি অনুরোধ করতে চাই

http://example.com/some/path/section/index.html -> http://192.168.1.24/section/index.html

এবং আবারও মূল URL টি সংরক্ষণ করে।

আমাদের প্রচেষ্টাগুলি প্রক্সি এবং পুনর্লিখনের নিয়মগুলি ব্যবহার করে বিভিন্ন সমাধানকে জড়িত করেছে এবং নীচে এমন কনফিগারেশন দেখায় যা আমাদের সমাধানের সবচেয়ে নিকটে এনেছে (নোট করুন এটি ওয়েব সার্ভারের জন্য ওয়েব সার্ভার কনফিগারেশন example.com)। তবে এটির সাথে এখনও দুটি সমস্যা রয়েছে:

  • এটি ওয়েব-সার্ভারের মাধ্যমে প্রাপ্ত অনুরোধ URL টি http://192.168.1.24অন্তর্ভুক্ত রয়েছে /some/pathএবং তাই প্রয়োজনীয় পৃষ্ঠাটি পরিবেশন করতে ব্যর্থ হয়েছে।
  • আপনি যখন কোনও লিঙ্কে ঘুরে দেখেন একবার পৃষ্ঠার পরিবেশন করার পরে, /some/pathURL থেকে অনুপস্থিত

    server {
        listen          80;
        server_name     www.example.com;
    
        location /some/path/ {
            proxy_pass http://192.168.1.24;
            proxy_redirect http://www.example.com/some/path http://192.168.1.24;
            proxy_set_header Host $host;
        }
    
        location / {
            index index.html;
            root  /var/www/example.com/htdocs;
        }
    }
    

আমরা এমন একটি সমাধান খুঁজছি যা কেবলমাত্র ওয়েব সার্ভারের কনফিগারেশনটি চালু রাখতে জড়িত example.com। আমরা 192.168.1.24কনফিগারটি পরিবর্তন করতে সক্ষম হয়েছি (এছাড়াও এনগিনেক্স), তবে আমরা এটি চেষ্টা করতে এবং এড়াতে চাই কারণ আমাদের শত শত বিভিন্ন সার্ভারের জন্য এই সেটআপটির পুনরাবৃত্তি করতে হবে যার অ্যাক্সেস প্রক্সড হয়ে গেছে example.com

উত্তর:


59

প্রথমত, আপনি rootঅবস্থানের ব্লকের ভিতরে নির্দেশনা ব্যবহার করা উচিত নয় , এটি একটি খারাপ অভ্যাস। এক্ষেত্রে যদিও বিষয়টি কিছু যায় আসে না।

দ্বিতীয় অবস্থান ব্লক যুক্ত করার চেষ্টা করুন:

location ~ /some/path/(?<section>.+)/index.html {
    proxy_pass http://192.168.1.24/$section/index.html;
    proxy_set_header Host $host;
}

এটি কিছু অংশ / পরে / পথ / এবং সূচক html এর আগে $ বিভাগের ভেরিয়েবলের কাছে ক্যাপচার করে, যা প্রক্সি_পাস গন্তব্য সেট করতে ব্যবহৃত হয়। আপনার প্রয়োজন হলে আপনি রেজেক্স আরও নির্দিষ্ট করে তুলতে পারেন।


1
দেরিতে জবাবের জন্য দুঃখিত - এটি আমরা যা খুঁজছি তা অর্জনের খুব কাছাকাছি। একমাত্র ত্রুটিটি হ'ল, একবার লক্ষ্য পৃষ্ঠাটি পরিবেশন করা হয়ে গেলে ব্রাউজারে লিঙ্কগুলির জন্য ইউআরএলগুলিতে '/ কিছু / পথ /' অন্তর্ভুক্ত করা হয় না, যার অর্থ কোনও ব্যবহারকারী যদি তাদের ক্লিক করে তবে তারা কাজ করে না। যদি আমরা কীভাবে এটি কাটিয়ে উঠতে চেষ্টা করতে পারি তবে আমি উত্তরটি আপডেট করব এবং গ্রহণ করব, কারণ এটি প্রায় রয়েছে।
robjohncox

8
ব্রাউজারটি দেখুন লিঙ্কগুলি 192.168.1.24 সার্ভারে চলমান সফ্টওয়্যার দ্বারা তৈরি করা হয়েছে are আপনি যা চান তা অর্জন করতে আপনার সেই সফ্টওয়্যারটি পরিবর্তন করতে হবে।
তেরো কিলকেনেন

নিশ্চিত না যে আমি অবস্থানের ব্লকের অভ্যন্তরে মূল সম্পর্কে আপনার সতর্কতাটি অনুসরণ করি। nginx ডকুমেন্টেশন পড়া এটি স্টাফ করার সঠিক উপায়। তারা কেবলমাত্র সমস্ত অবস্থানের বাইরে কোনও ডিফল্ট রুট না থাকার থেকে খারাপ অভ্যাসকে সতর্ক করে। nginx.com
লোক মোগ্রাবি

ঠিক আছে, rootকোনও locationব্লকের অভ্যন্তরে থাম্বের নিয়ম ব্যবহার না করা সহজ , তবে আপনি ডিফল্ট অবস্থানগুলির জন্য কোনও অপ্রত্যাশিত আচরণ পাবেন না। কেবলমাত্র যদি rootপ্রতিটি অবস্থানের জন্য আপনাকে ডিফল্ট পরিবর্তন করতে হয় তবে আপনি এটি ব্যবহার করতে পারেন।
তেরো কিলকানেন

1
নাম হিসাবে $ হোস্টটি কী বোঝায় ? সঠিক HTTP শিরোনামটি কী প্রেরণ করা হয়েছিল এবং আপনি কী এটি প্রেরণ করতে চান?
টেরো কিলকেনেন

65

proxy_passনির্দেশের ক্ষেত্রে আপনার ইউআরআই অংশ ব্যবহার করা উচিত । এছাড়াও, আপনি proxy_redirectনির্দেশের আদেশের যুক্তিগুলি মিশ্রিত করেছেন এবং সম্ভবত আপনার এটির কোনও প্রয়োজন নেই। এই নির্দেশের জন্য এনগিনেক্সের যুক্তিসঙ্গত ডিফল্ট রয়েছে।

এই ক্ষেত্রে আপনার locationব্লকটি সত্যই সহজ হতে পারে:

location /some/path/ {
    proxy_pass http://192.168.1.24/;
    # note this slash  -----------^
    proxy_set_header Host $host;
}

1
দেরিতে জবাবের জন্য দুঃখিত - আমি এটি চেষ্টা করেছিলাম এবং দুর্ভাগ্যক্রমে এটি আমাদের ব্যবহারের ক্ষেত্রে কার্যকর হয় না। সমস্যাটি হ'ল, যখন অনুরোধটি টার্গেট সার্ভারে করা হয়, তখন /some/path/URL এর অংশটি অনুরোধে সংরক্ষিত থাকে যা কোনও বৈধ ইউআরএল নয় (এটি মুছে ফেলার জন্য আমাদের ইউআরএলও পুনরায় লেখার প্রয়োজন)।
robjohncox

@robjohncox আপনি ঠিক কী চেষ্টা করেছেন?
অ্যালেক্সি টেন

9
স্ল্যাশ আমার জন্য কৌশলটি করেছে। এখন mydomain.com/some/path/* 192.168.1.24/* এ সঠিকভাবে প্রক্স করা হয়েছে এবং 192.168.1.24/some/path/* নয়
ভাদিমো

7
এই প্রতিক্রিয়াতে আমি কি "# এই স্ল্যাশটি নোট করুন" মন্তব্যটি উত্সাহিত করতে পারি? তিনটি চিয়ার্স!
8one6

এটি কীভাবে আপনার সকলের জন্য কাজ করছে তা নিশ্চিত নয়। এটি আমি অর্জন করার চেষ্টা করছি। যাইহোক, যখন কোনও ব্যবহারকারী কোনও লিঙ্কে ক্লিক করে যা স্থানীয় পরিষেবাতে যেমন 192.168.1.24/ লগইনকে পুনঃনির্দেশিত করবে তখন তাকে মাইডোমেন / সেমিন
পাথ

4

/some/path/ফ্রন্ট-এন্ড এবং /ব্যাকএন্ডের মধ্যে 100% বিরামবিহীন ম্যাপিংয়ের জন্য আপনি নীচের কনফিগারেশনটি ব্যবহার করতে পারেন ।

মনে রাখবেন যে এটি এখন পর্যন্ত একমাত্র উত্তর যা সম্পূর্ণরূপে 404 Not Foundত্রুটিগুলি উত্পন্ন করার পথগুলি নিরবিচ্ছিন্নভাবে যত্ন নেবে যদি শর্ত থাকে যে সঠিক HTTP Refererশিরোনামটি ব্রাউজার দ্বারা প্রেরণ করা হয়েছে, সুতরাং, এই সমস্ত জিআইএফগুলি অন্তর্নিহিত এইচটিএমএল সংশোধন করার প্রয়োজন ছাড়াই লোড চালিয়ে যাওয়া উচিত (যা কেবল ব্যয়বহুল নয়, তবে অতিরিক্ত মডিউলগুলি ডিফল্টরূপে সংকলন না করে সমর্থনযোগ্য নয়)।

location /some/path/ {
    proxy_pass http://192.168.1.24/; # note the trailing slash!
}
location / {
    error_page 404 = @404;
    return 404; # this would normally be `try_files` first
}
location @404 {
    add_header Vary Referer; # sadly, no effect on 404
    if ($http_referer ~ ://[^/]*(/some/path|/the/other)/) {
        return 302 $1$uri;
    }
    return 404 "Not Found\n";
}

আপনি https://github.com/cnst/StackOverflow.cnst.nginx.conf সংগ্রহস্থলের মধ্যে সম্পূর্ণ প্রুফ-অফ-কনসেপ্ট এবং ন্যূনতম-কার্যকর-পণ্যটি দেখতে পারেন

সমস্ত প্রান্তের কেসগুলি কাজ করে বলে মনে হচ্ছে তা নিশ্চিত করার জন্য এখানে একটি পরীক্ষা চালানো হয়েছে:

curl -v -H 'Referer: http://example.su/some/path/page.html' localhost:6586/and/more.gif | & fgrep -e HTTP/ -e Referer -e Location
> GET /and/more.gif HTTP/1.1
> Referer: http://example.su/some/path/page.html
< HTTP/1.1 302 Moved Temporarily
< Location: http://localhost:6586/some/path/and/more.gif
< Vary: Referer

curl -v localhost:6586/and/more.gif | & fgrep -e HTTP/ -e Referer -e Location
> GET /and/more.gif HTTP/1.1
< HTTP/1.1 404 Not Found

curl -v localhost:6586/some/path/and/more.gif | & fgrep -e HTTP/ -e Referer -e Location -e uri
> GET /some/path/and/more.gif HTTP/1.1
< HTTP/1.1 200 OK
request_uri:    /and/more.gif

পিএস যদি আপনার কাছে মানচিত্রের অনেকগুলি পৃথক পাথ থাকে তবে তার $http_refererমধ্যে একটি ifঅভ্যন্তরের মধ্যে একটি রেজেক্স তুলনা location @404না করে আপনি তার mapপরিবর্তে গ্লোবাল ভিত্তিক নির্দেশিকা ব্যবহার করতে চাইতে পারেন ।

এটিও লক্ষ করুন যে উভয়টিতেই পিছনের স্ল্যাশগুলি proxy_pass, পাশাপাশি locationএটি অন্তর্ভুক্ত রয়েছে, সম্পর্কিত উত্তর হিসাবে যথেষ্ট গুরুত্বপূর্ণ

তথ্যসূত্র:


2

যখন সেই স্ল্যাশ একটি এনজিনেক্স প্রক্সড জেনকিনগুলিতে যুক্ত করা হয়, তখন আপনাকে "আপনার বিপরীত প্রক্সি সেটআপটি ভেঙে যায়" ত্রুটির সাথে উপস্থাপিত হয়।

proxy_pass          http://localhost:8080/;

Remove this -----------------------------^

এটা পড়া উচিত

proxy_pass          http://localhost:8080;

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