এনজিআইএনএক্স কনফিগারেশনে দুটি অবস্থানের জন্য আমি কীভাবে একই নিয়ম রাখতে পারি?


153

এনজিআইএনএক্স কনফিগারেশনে দুটি অবস্থানের জন্য আমি কীভাবে একই নিয়ম রাখতে পারি?

আমি নিম্নলিখিত চেষ্টা করেছি

server {
  location /first/location/ | /second/location/ {
  ..
  ..
  }
}

তবে এনজিনেক্স রিলোডটি এই ত্রুটিটি ছুঁড়ে ফেলেছে:

nginx: [emerg] invalid number of arguments in "location" directive**

উত্তর:


239

চেষ্টা

location ~ ^/(first/location|second/location)/ {
  ...
}

~মানে URL এর জন্য একটি রেগুলার এক্সপ্রেশন ব্যবহার করতে। ^মানে প্রথম অক্ষর থেকে বার করো। এটি /এর পরে অবস্থানগুলির উভয়টি অনুসরণ করবে এবং তার পরে অন্যটি সন্ধান করবে /


37
দ্রষ্টব্য: যদি এটি প্রায়শই ঘটে (হাজারের মতো), তবে রেজেক্সের মিলের কারণে এটি একটি পারফরম্যান্স পেনাল্টি বহন করবে। এছাড়াও মিলের ক্রমটি যথেষ্ট আলাদা। অনেকগুলি "ছোট" ক্ষেত্রে এটি আপনার পছন্দ মতো আচরণ করবে তবে সচেতন থাকার বিষয়টি এটি। আমি ব্যক্তিগতভাবে এনগিনেক্সকে "অবস্থান" একাধিক "=" শর্তাবলী সমর্থন করতে চাই যা একটি রেজেক্স নিয়মের উপর নির্ভর না করে।
বার্নার্ড

7
আইএমএইচও, এটি আরও দক্ষ হওয়া উচিত: অবস্থান ~ (প্যাটার্নঅন | প্যাটার্নটো) {...}
স্ট্যামস্টার

2
এই সমাধানটি আমার পক্ষে কার্যকর হয়নি; তবে @ স্ট্যামস্টার এর মন্তব্য করেছে; আমি দৌড়াচ্ছিnginx/1.13.2
টিজে বিডল

1
যদি আপনি প্রয়োজন proxy_pass: কাজ, এই উত্তর দেখার stackoverflow.com/a/46625656/1246870
avs099

1
মূল URL টি কোনও স্ল্যাশ ছাড়াই শেষ হয়ে গেলে এটি আমার পক্ষে কাজ করে না
দ্য গডফাদার

88

আরেকটি বিকল্প হ'ল একটি অন্তর্ভুক্ত ফাইল ব্যবহার করে দুটি উপসর্গের স্থানে নিয়মের পুনরাবৃত্তি করা। যেহেতু উপসর্গ অবস্থানগুলি কনফিগারেশনে অবস্থান স্বতন্ত্র, সেহেতু আপনি পরে অন্যান্য রেগেক্স অবস্থানগুলি যুক্ত করার সাথে সেগুলি ব্যবহার করে কিছু বিভ্রান্তি রক্ষা করতে পারে। আপনি যখন আপনার কনফিগারেশন স্কেলটিকে সুগঠিত করতে সহায়তা করতে পারবেন তখন রেগেক্স অবস্থানগুলি এড়ানো।

server {
    location /first/location/ {
        include shared.conf;
    }
    location /second/location/ {
        include shared.conf;
    }
}

এখানে একটি নমুনা ভাগ করা হয়েছে:

default_type text/plain;
return 200 "http_user_agent:    $http_user_agent
remote_addr:    $remote_addr
remote_port:    $remote_port
scheme:     $scheme
nginx_version:  $nginx_version
";

আপনি shared.confউদাহরণ এবং অবস্থান দয়া করে যোগ করতে পারেন ?
Дмитрий Кулешов

5
আমি শেয়ারডকনফ ফাইলটি একটি উদাহরণ যুক্ত করেছি। আপনি শেয়ারডকনফের একটি নিখুঁত পাথ ব্যবহার করতে পারেন বা এটি আপনার এনগিনেক্স ডিরেক্টরিতে রাখতে পারেন। এই ক্ষেত্রে, এটিতে বেশ কয়েকটি নির্দেশ রয়েছে।
কোল টের্নি

40

রেজেক্স এবং অন্তর্ভুক্ত ফাইল উভয়ই ভাল পদ্ধতি এবং আমি প্রায়শই সেগুলি ব্যবহার করি। তবে অন্য বিকল্পটি হ'ল "নামকরণ করা অবস্থান" ব্যবহার করা, যা অনেক পরিস্থিতিতে একটি কার্যকর পদ্ধতির - বিশেষত আরও জটিল। সরকারী পৃষ্ঠা "যদি মন্দ হয়" শো মূলত একটি ভালো উপায় কিছু করার হিসাবে নিম্নলিখিত:

error_page 418 = @common_location;
location /first/location/ {
    return 418;
}
location /second/location/ {
    return 418;
}
location @common_location {
    # The common configuration...
}

এই বিভিন্ন পদ্ধতির সুবিধা এবং অসুবিধা রয়েছে। রিজেক্সের একটি বড় সুবিধা হ'ল আপনি ম্যাচের অংশগুলি ক্যাপচার করতে এবং প্রতিক্রিয়াটি পরিবর্তন করতে সেগুলি ব্যবহার করতে পারেন। অবশ্যই, আপনি মূল ব্লকে একটি ভেরিয়েবল সেট করে বা ব্যবহার করে অন্যান্য পদ্ধতির সাথে একইরকম ফলাফল অর্জন করতে পারেন map। রেজেক্স পদ্ধতির খারাপ দিকটি হ'ল যদি আপনি বিভিন্ন অবস্থানের সাথে মেলে রাখতে চান তবে এটি অযৌক্তিক হতে পারে, সাথে সাথে কোনও রেজেক্সের কম নজির আপনি কীভাবে লোকেশনগুলি মেলাতে চান তার সাথে এটি খাপ খায় না - উল্লেখযোগ্যভাবে বলা যায় না যে এখানে পারফরম্যান্সের প্রভাব রয়েছে কিছু ক্ষেত্রে regexes থেকে।

ফাইলগুলি অন্তর্ভুক্ত করার মূল সুবিধা (যতদূর আমি বলতে পারি) এটি হ'ল আপনি কী কী অন্তর্ভুক্ত করতে পারেন সে সম্পর্কে এটি কিছুটা নমনীয় - উদাহরণস্বরূপ এটি একটি সম্পূর্ণ লোকেশন ব্লক হওয়ার দরকার নেই। তবে এটি নামমাত্র অবস্থানগুলির তুলনায় কেবল বিষয়গতভাবে কিছুটা ক্লানকিয়ার।

এছাড়াও নোট করুন যে এখানে একটি সম্পর্কিত সমাধান রয়েছে যা আপনি অনুরূপ পরিস্থিতিতে ব্যবহার করতে সক্ষম হতে পারেন: নেস্টেড অবস্থানগুলি। ধারণাটি হ'ল আপনি খুব সাধারণ অবস্থানের সাথে শুরু করবেন, সম্ভাব্য কয়েকটি ম্যাচে সাধারণভাবে কিছু কনফিগারেশন প্রয়োগ করবেন এবং তারপরে বিভিন্ন ধরণের পাথের জন্য পৃথক নেস্টেড লোকেশন পাবেন যা আপনি মেলাতে চান। উদাহরণস্বরূপ, এটির মতো কিছু করা কার্যকর হতে পারে:

location /specialpages/ {
    # some config
    location /specialpages/static/ {
        try_files $uri $uri/ =404;
    }
    location /specialpages/dynamic/ {
        proxy_pass http://127.0.0.1;
    }
}

7

এটি সংক্ষিপ্ত, তবুও দক্ষ এবং প্রমাণিত পদ্ধতির:

location ~ (patternOne|patternTwo){ #rules etc. }

সুতরাং সহজেই একই পাইপ বাক্য / বিধিগুলিকে নির্দেশ করে সাধারণ পাইপ সিনট্যাক্স সহ একাধিক নিদর্শন থাকতে পারে।

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