بازنویسی URL در NGINX با استفاده از return و rewrite

دستورهای بازنویسی در NGINX برای تغییر کامل یا بخشی از URL ای که توسط کلاینت درخواست شده استفاده می‌شوند. هدف اصلی از تغییر URL این است که به کلاینت‌ها اطلاع بدهیم منابع موردنظرشان به مکان دیگری منتقل شده‌اند و علاوه بر آن جریان اجرای صفحات را در NGINX کنترل کنیم. در NGINX برای بازنویسی URL از دو دستور return و rewrite استفاده می‌شود. هر دو دستور عملکرد مشابهی برای بازنویسی URL دارند؛ با این حال دستور rewrite قدرتمندتر است و برای بازنویسی‌های پیچیده‌ای که نیاز به پارس کردن URL دارند تنها از rewrite می‌توان استفاده کرد. در این آموزش به بررسی نحوه استفاده از هر دو دستور return و rewrite در NGINX برای تغییر یا بازنویسی URL می‌پردازیم.

استفاده ساده و مرتب با دستور return

ساده‌ترین و پاکیزه‌ترین روش بازنویسی URL با استفاده از دستور return است. دستور return باید در زمینهٔ server یا location تعریف شود و URL مقصد را مشخص کند.

دستور return در زمینهٔ server وقتی مفید است که سایت خود را به دامنهٔ جدیدی منتقل کرده‌اید و می‌خواهید تمام URL های قدیمی را به دامنهٔ جدید هدایت کنید. همچنین برای ایجاد canonicalization نیز کاربرد دارد؛ مثلاً برای هدایت سایت به نسخهٔ www یا بدون www.

مثال: اگر در زمینهٔ server بنویسید که هر درخواستی به www.olddomain.com به www.newdomain.com هدایت شود، هرگاه NGINX یک URL با www.olddomain.com دریافت کند پردازش را متوقف کرده و با کد پاسخ 301 همراه با URL بازنویسی‌شده به کلاینت پاسخ می‌دهد. دو متغیر استفاده‌شده در این دستور $scheme و $request_uri هستند. متغیر $scheme نشان‌دهندهٔ اسکیم (http یا https) و متغیر $request_uri شامل URI کامل همراه با پارامترها (در صورت وجود) است. توجه کنید هر دو متغیر این اطلاعات را از URL ورودی می‌گیرند.

هدایت صفحات خاص

در برخی موقعیت‌ها ممکن است بخواهید صفحات را به‌جای دامنه‌ها هدایت کنید. قرار دادن دستور return داخل بلوک location به شما اجازه می‌دهد صفحات مشخصی را به مکان جدید هدایت کنید.

مثال: هرگاه URI درخواست‌شده دقیقاً با الگو /tutorial/learning-nginx مطابقت داشته باشد، NGINX آن را به https://example.com/nginx/understanding-nginx/ بازنویسی خواهد کرد. همچنین می‌توانید همهٔ صفحات زیر یک مسیر مشخص را به مکان جدید هدایت کنید. برای نمونه می‌توان همهٔ صفحات زیر /tutorial را به https://example.com/articles فرستاد.

استفاده از دستور rewrite

می‌توانیم از دستور rewrite نیز برای بازنویسی URL در NGINX استفاده کنیم. مانند دستور return، rewrite نیز می‌تواند در contextهای server و location قرار بگیرد. دستور rewrite توانایی انجام تفکیک‌های پیچیده بین URLها و استخراج عناصر از URL اصلی را دارد که معادل متغیرهای NGINX نیستند؛ بنابراین در موارد پیچیده‌تر از rewrite استفاده می‌شود. سینتکس دستور rewrite به این صورت است:

rewrite regex replacement [flag];

توجه داشته باشید دستور rewrite تنها می‌تواند کدهای 301 یا 302 را برگرداند. برای بازگرداندن سایر کدها باید پس از rewrite از دستور return صراحتاً استفاده کنید.

مثال‌های پایه‌ای rewrite

بیایید چند قاعدهٔ rewrite ساده را بررسی کنیم که از بازنویسی یک صفحهٔ html ساده تا URLهای دینامیک را پوشش می‌دهد:

بازنویسی صفحهٔ ساده

فرض کنید می‌خواهید URL یک صفحه مانند https://example.com/nginx-tutorial را به https://example.com/somePage.html بازنویسی کنید. دستور rewrite در یک بلوک location می‌تواند چنین چیزی باشد:

location = /nginx-tutorial {
    rewrite ^/nginx-tutorial?$ /somePage.html break;
}

توضیح:

  • دیرکتیو location = /nginx-tutorial نشان می‌دهد که بلوک location تنها با URL ای که دقیقاً پیشوند /nginx-tutorial را داشته باشد، مطابقت می‌کند.
  • NGINX دنبال الگوی ^/nginx-tutorial?$ در URL درخواست‌شده می‌گردد. در این الگو:
    • ^ نشان‌دهندهٔ آغاز رشته است.
    • $ نشان‌دهندهٔ پایان رشته است.
    • ? نشان‌دهندهٔ modifier غیرحریص (non-greedy) است که باعث می‌شود پس از پیدا شدن یک تطابق جستجو متوقف شود.
  • در صورت تطابق، /somePage.html به‌عنوان جایگزین استفاده می‌شود و چون قاعده با break پایان می‌یابد، بازنویسی متوقف می‌شود اما درخواست بازنویسی‌شده به یک location دیگر ارجاع داده نمی‌شود.

بازنویسی صفحات دینامیک با پارامتر

مثال: فرض کنید یک صفحهٔ دینامیک دارید مانند https://www.example.com/user.php?id=11 که بخش دینامیک id=11 است (شناسهٔ کاربر). می‌خواهیم URL را به https://exampleshop.com/user/11 بازنویسی کنیم. اگر برای هر کاربر یک قاعده جداگانه بسازیم باید برای 10 کاربر، 10 قاعده بنویسیم. به‌جای آن می‌توانیم عناصر URL را در متغیرها بگیریم و یک قاعدهٔ واحد بسازیم که همهٔ صفحات دینامیک را پوشش دهد.

rewrite ^/user/([0-9]+)$ /user.php?id=$1 last;

توضیح: برای مثال اگر ورودی https://www.example.com/user/24 باشد، شناسهٔ کاربر 24 با بخش مرجع عقب (back-reference) مطابقت پیدا می‌کند و جایگزینی نهایی می‌شود: https://www.example.com/user.php?id=24.

بازنویسی با پارامترهای حروفی

مثال: اگر URL ورودی مانند https://www.example.com/user.php?user_name=john باشد و بخواهید به https://www.example.com/user/login/john بازنویسی کنید، چون بخش دینامیک شامل حروف است می‌توان از قاعدهٔ زیر استفاده کرد:

rewrite ^/user/login/([A-Za-z]+)$ /user.php?user_name=$1 last;

توضیح: برای مثال اگر URL ورودی https://www.example.com/user/login/john باشد، نام کاربری john با بخش مرجع عقب مطابقت می‌کند و جایگزینی می‌شود: https://www.example.com/user.php?user_name=john.

بازنویسی با چند backreference

مثال: فرض کنید URL ورودی https://example.com/tutorial/linux/wordpress/file1 است و می‌خواهید آن را به https://example.com/tutorial/linux/cms/file1.php بازنویسی کنید. در این مثال عبارت wordpress باید در بخشی از مسیر با cms جایگزین شود و پسوند .php نیز به انتهای نام فایل اضافه گردد. یک قاعدهٔ rewrite مناسب برای این سناریو به‌صورت زیر خواهد بود:

rewrite ^/tutorial/(.+)/wordpress/(.+)$ /tutorial/$1/cms/$2.php last;

توضیح: این قاعده بخش‌هایی از مسیر را در گروه‌های مرجع می‌گیرد و سپس آنها را در مسیر جدید قرار می‌دهد و پسوند .php را اضافه می‌کند.

حالا می‌توانید از دستورهای rewrite یا return برای بازنویسی URL استفاده کنید. مثال‌های استفاده از rewrite در این آموزش ساده و قابل فهم هستند. حالا می‌توانید به نوشتن قاعده‌های بازنویسی پیچیده‌تر بپردازید!

سپاس از اینکه با جامعهٔ ParminCloud یاد گرفتید. دربارهٔ محصولات ما در حوزهٔ محاسبات، ذخیره‌سازی، شبکه و پایگاه‌داده‌های مدیریت‌شده بیشتر بدانید.

Click to rate this post!
[Total: 0 Average: 0]

نظرات کاربران

دیدگاهی بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *