طرح‌چه

مودیفایرهای لوکیشن | Nginx from scratch

۲۸ تیر ۱۴۰۴

مودیفایرهای لوکیشن | Nginx from scratch
با مودیفایرهای لوکیشن آشنا میشیم و نحوه استفاده از آنها رو بررسی میکنیم.

دستور location در NGINX برای تعریف نحوه پردازش درخواست‌های HTTP بر اساس URI (نه URL کامل) استفاده می‌شود.

URL => https://example.com:8080/blog/index.html?page=1
URI => /blog/index.html

زمانی که Nginx یک درخواست را دریافت می‌کند، ابتدا URL کامل از کلاینت دریافت می‌شود. سپس تنها بخش URI (یعنی قسمت path آدرس) از آن جدا شده و با بلاک‌های location مقایسه می‌شود تا تطابق مناسب پیدا شود.

به همراه دستور location میتوان یک مودیفایر (modifier) استفاده کرد که نحوه تطبیق با URI را مشخص میکند, در ادامه هرکدام از مودیفایر ها را بررسی میکنیم.

تطابق دقیق

اگر از = برای تطبیق URI استفاده کنیم, تطابق به صورت دقیق انجام خواهد شد. یعنی URI باید دقیقا برابر با مقداری باشد که ما مشخص کرده ایم:

server {
    listen 9091 default_server;

    location = /about {
        default_type text/html;
    
        return 200 "<h1>This is the About page.</h1>";
    }
}

تطابق با عبارت باقاعده (Regex)

با استفاده از ~ میتوان URI را با یک عبارت باقاعده حساس به بزرگ یا کوچک بودن حروف تطبیق داد.

server {
    listen 9092 default_server;

    location ~ ^/age/([0-9]+)$ {
        default_type text/html;

        return 200 "<h1>Your age is: $1</h1>";
    }
}

در صورتی که نخواهیم عبارت باقاعده ی ما نسبت به حروف کوچک یا بزرگ حساس باشد میتوانیم تطبیق را با استفاده از *~ انجام دهیم.

server {
    listen 9093 default_server;

    location *~ ^/age/([0-9]+)$ {
        default_type text/html;

        return 200 "<h1>Your age is: $1</h1>";
    }
}

استفاده از پرانتز باعث ایجاد یک capture group ایجاد می شود و میتوان با استفاده از علامت $‍ به همراه یک عدد که نشانگر شماره ی capture group است, به مقداری که با این capture group تطبیق داده شده است دسترسی داشت.  

با توجه به مثال بالا اگر به مسیر /age/123 بروید (بعد از age باید یک عدد قرار دهید تا مسیر وارد شده تطبیق داده شود) درون صفحه مقداری که توسط capture group تطبیق داده شده است در صفحه نمایش داده میشود.

تطابق پیشوندی (prefix match)

اگر بخواهیم تمام مسیرهایی که با یک پیشوند خاص شروع می شوند را تطبیق دهیم میتوانیم از تطابق پیشوندی استفاده کنیم تطابق پیشوندی به دو صورت وجود دارد.

  • تطابق پیشوندی با اولویت بالا ^~
  • تطابق پیشوندی ساده (بدون استفاده از هیچ modifier)
server {
    listen 9094 default_server;

    location ^~ /pages/ {
        alias /var/www/public;
        index index.html;
    }
}

در صورتی که از ^~ استفاده کنیم تطابق پیشوندی با اولویت بالا انجام خواهد شد. بدین صورت اگر URI با این پیشوند شروع شود، مستقیم این location بلاک انتخاب تطبیق داده میشود.

نوع دیگری از تطابق پیشوندی وجود دارد که به صورت زیر انجام میشود:

server {
    listen 9095 default_server;

    location /pages/ {
        alias /var/www/public;
        index index.html;
    }
}

در این نوع تطابق از هیچ نوع مودیفایری استفاده نمیشود! این نوع تطبیق پایین ترین اولویت را دارد.

اولویت انتخاب بلاک‌ها توسط nginx به صورت زیر است: 

  • بررسی بلاک‌هایی با = (تطابق دقیق)
  • بررسی بلاک‌هایی با ^~ (پیشوندی با اولویت)
  • بررسی تمام بلاک هایی با regex‌ (‍~ یا *~)  و انتخاب بهترین تطابق
  • استفاده از بلاک‌هایی با تطابق پیشوندی ساده

برای اطلاعات بیشتر مستندات مربوط به دستور location رو بررسی کنید. همچنین به مثال هایی که در این قسمت بررسی کردیم رو میتونید از طریق گیت هاب دسترسی داشته باشید.


قسمت قبل: فشرده سازی پاسخ ها | Nginx from scratch


دیدگاه ها