انجیناکس؛ شب ۱۰: redirect، rewrite و query string
فهرست نوشته
انتقال نشانی قدیمی با مسیریابی داخلی برنامه متفاوت است. امشب redirect را بدون ساختن حلقه یا اعتماد به Host ورودی پیاده میکنیم.
این جلسه بخشی از دورهٔ انجیناکس در ۵۰ شب است. قرارداد آزمایشگاه، مسیرها و روال اعمال تغییر در راهنمای دوره آمده است.
محیط: www روی HTTP؛ HTTPS عمومی هنوز فعال نشده و 301 دائمی را تا پایان آزمون انتخاب نمیکنیم.
هدایت با مقصد ثابت#
در server:
location = /old {
return 302 /new;
}
302 برای آزمایش موقت است؛ مرورگر ممکن است 301 دائمی را cache کند. با curl -I هدر Location و با -L زنجیرهٔ هدایت را بررسی کن. /new در این lab اگر فایل ندارد 404 میدهد؛ redirect موفق با وجود مقصد یکی نیست.
بعد از آمادهشدن TLS، بلوک HTTP www میتواند فقط این باشد:
server {
listen 80;
server_name www.nginx.test;
return 301 https://www.nginx.test$request_uri;
}
این بخش تا شب دوازدهم اجرا نمیشود. $request_uri مسیر اصلی همراه query است؛ مقصد canonical ثابت از تبدیل Host ناشناس به نشانی هدایت جلوگیری میکند. برای ACME روش webroot، مسیر challenge باید جدا سرو شود و return سطح server میتواند قبل از location آن اجرا شود؛ در شب سیزدهم نمونهٔ مناسب داریم.
بازنویسی داخلی#
rewrite ... last انتخاب location را برای URI تازه از سر میگیرد؛ break پردازش rewrite همین context را متوقف میکند. برای routing عادی فایل و WordPress، try_files روشنتر است. تغییر مکرر URI میتواند حلقه و خطای 500 بسازد.
آزمون و بازگشت: درخواست دارای query، نام ناشناس و مقصد بدون فایل را جدا بفرست. قانون را بردار و انتظار 404 مسیر old را داشته باش. بهجای انتخاب دائمی redirect هنگام آزمایش، ابتدا رفتار تمام مسیرها را ثبت کن.
منبع: return و rewrite .