ماژول mod_rewrite Apache به شما امکان می دهد URL ها را با تمیزتر بازنویسی کنید ، مسیرهای قابل خواندن توسط انسان را به رشته های پرس و جوی متناسب با کد تبدیل کنید. همچنین به شما امکان می دهد URL ها را بر اساس شرایط بازنویسی کنید.
فایل .htaccess به شما امکان می دهد بدون دسترسی به فایل های پیکربندی
در این آموزش ، mod_rewrite را فعال کرده و از فایلهای .htaccess برای ایجاد یک تغییر مسیر URL اصلی استفاده می کنید ، و سپس چند مورد استفاده پیشرفته را پیدا می کنید.
پیش نیازها
برای دنبال کردن این آموزش ، به موارد زیر نیاز دارید:
مرحله 1 - فعال کردنmod_rewrite
برای اینکه Apache بتواند قوانین بازنویسی را درک کند ، ابتدا باید mod_rewrite را فعال کنیم. قبلاً نصب شده است ، اما در نصب پیش فرض Apache غیرفعال است. برای فعال کردن ماژول از دستور a2enmod استفاده کنید:
middot; $ sudo a2enmod rewritemiddot;
با این کار ماژول فعال می شود یا به شما هشدار می دهد که ماژول از قبل فعال شده است. برای اجرای این تغییرات ، Apache را مجدداً راه اندازی کنید.
middot; $ sudo systemctl restart apache2middot;
اکنون mod_rewrite کاملاً فعال است. در مرحله بعدی، یک فایل .htaccess را برای تعریف قوانین بازنویسی برای تغییر مسیرها تنظیم خواهیم کرد.
مرحله 2 - تنظیم.htaccess
یک فایل .htaccess به ما امکان می دهد قوانین بازنویسی خود را بدون دسترسی به فایل های پیکربندی
توجه: هر قانونی که می توانید در یک فایل .htaccess قرار دهید ، می تواند مستقیماً در فایل های پیکربندی
با این حال ، در این مثال ساده ، افزایش عملکرد ناچیز خواهد بود. علاوه بر این ، تنظیم قوانین در .htaccess مناسب است ، به خصوص با چندین وب سایت در همان
قبل از شروع استفاده از فایل های .htaccess ، باید تنظیمات دیگری را انجام و آن را ایمن کنید.
به طور پیش فرض ، Apache با استفاده از فایل .htaccess اعمال قوانین بازنویسی را ممنوع می کند ، بنابراین ابتدا باید تغییراتی در فایل اعمال کنید. فایل پیش فرض پیکربندی Apache را با استفاده از nano یا ویرایشگر متن مورد علاقه خود باز کنید.
middot; $ sudo nano /etc/apache2/sites-available/000-default.confmiddot;
در داخل آن فایل ، بلوک
/etc/apache2/sites-available/000-default.conf
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
. . .
فایل را ذخیره کنید و ببندید. برای اجرای این تغییرات ، Apache را مجدداً راه اندازی کنید.
middot; $ sudo systemctl restart apache2middot;
اکنون ، یک فایل .htaccess را در webroot ایجاد کنید.
middot; $ sudo nano /var/www/html/.htaccessmiddot;
این خط را در بالای فایل جدید اضافه کنید تا موتور بازنویسی فعال شود.
/var/www/html/.htaccess
RewriteEngine on
فایل را ذخیره کرده و خارج شوید.
اکنون ما یک فایل .htaccess عملیاتی داریم که می توانیم از آن استفاده کنیم تا قوانین مسیریابی برنامه وب را کنترل کنیم. در مرحله بعد ، ما فایلهای وب سایت نمونه را ایجاد خواهیم کرد که برای نشان دادن قوانین بازنویسی قوانین از آنها استفاده خواهیم کرد.
مرحله 3 - پیکربندی بازنویسیURL
در اینجا ، یک بازنویسی URL اصلی را تنظیم می کنیم که URL های زیبا را به مسیرهای واقعی به صفحات تبدیل می کند. به طور خاص ، به کاربران این امکان را می دهیم که به http: // your_server_ip / about دسترسی پیدا کنند ، اما صفحه ای به نام about.html را نمایش می دهند.
با ایجاد فایلی به نام about.html در webroot شروع کنید.
middot; $ sudo nano /var/www/html/about.htmlmiddot;
کد HTML زیر را در فایل کپی کنید ، سپس آن را ذخیره کرده و ببندید.
/var/www/html/about.html
می توانید به این صفحه به آدرس http: //your_server_ip/about.html دسترسی پیدا کنید ، اما توجه داشته باشید که اگر سعی کنید به http: // your_server_ip / About خود دسترسی پیدا کنید ، خطای404 Not Found را مشاهده خواهید کرد. برای دسترسی به صفحه با استفاده از /about ، یک قانون بازنویسی ایجاد خواهیم کرد.
همه RewriteRules از این قالب پیروی می کنند:
General RewriteRule structure
RewriteRule pattern substitution [flags]
بیایید قانون بازنویسی URL ما را ایجاد کنیم. فایل .htaccess را باز کنید.
middot; $ sudo nano /var/www/html/.htaccessmiddot;
بعد از اولین خط ، RewriteRule هایلایت شده را اضافه کرده و فایل را ذخیره کنید.
در این حالت ، ^about$ الگو است ، About.html ، substitution است ، و [NC] پرچم است. مثال ما از چند کاراکتر با معنی خاص استفاده می کند:
اکنون می توانید به مرورگر خود به http: // your_server_ip / about دسترسی پیدا کنید. در واقع ، با این قانون که در بالا نشان داده شده است ، آدرس های اینترنتی زیر به about.html اشاره می کنند:
با این حال ، موارد زیر کار نخواهد کرد:
http: // your_server_ip / about / ، زیرا این قانون به صراحت بیان می کند که ممکن است بعد از آن چیزی وجود نداشته باشد ، زیرا کاراکتر $ بعد از about ظاهر می شود.
http: // your_server_ip / contact ، زیرا با رشته about در قانون مطابقت نمی دهد.
اکنون یک فایل .htaccess عملیاتی با یک قانون اساسی دارید که می توانید نیازهای خود را تغییر داده و گسترش دهید. در بخش های بعدی ، دو نمونه دیگر از بخشنامه های متداول را نشان خواهیم داد.
مثال 1 - ساده سازی رشته های جستار باRewriteRule
برنامه های وب اغلب از رشته های جستار استفاده می کنند ، که با استفاده از علامت سؤال (؟) بعد از آدرس به URL اضافه می شوند. پارامترهای جداگانه با استفاده از چ (amp;) محدود می شوند. رشته های جستار ممکن است برای انتقال داده های اضافی بین صفحات برنامه فردی استفاده شود.
به عنوان مثال ، یک صفحه نتیجه جستجو که به زبان PHP نوشته شده است ممکن است از URL مانند http://example.com/results.php؟item=shirtamp;season=summer استفاده کند. در این مثال ، دو پارامتر اضافی به اسکریپت برنامه result.php موهومی منتقل می شود: item ، با متغیر shirt ، و مقدار summer. برنامه ممکن است از اطلاعات رشته پرس و جو برای ایجاد صفحه مناسب برای بازدید کننده استفاده کند.
قوانین بازنویسی Apache اغلب برای ساده کردن پیوندهای طولانی و ناخوشایند مانند موارد فوق در URL های دوستانه که تایپ و تفسیر بصری آسان تر است ، به کار می روند. در این مثال ، ما می خواهیم لینک بالا را ساده کنید تا به http://example.com/shirt/summer تبدیل شوید. پارامتر shirt و summer هنوز در آدرس هستند اما بدون نام رشته و نام اسکریپت.
در اینجا یک قانون برای اجرای این وجود دارد:
Simple substitution
RewriteRule ^shirt/summer$ results.php?item=shirtamp;season=summer [QSA]
shirt/summer به طور واضح در آدرس درخواستی مطابقت دارد و به Apache گفته می شود که به جای آن ، results.php?item=shirtamp;season=summer را ارائه دهد.
پرچم های [QSA] معمولاً در قوانین بازنویسی استفاده می شوند. آنها به Apache می گویند هر رشته درخواست اضافی را در URL ارائه شده اضافه کند ، بنابراین اگر بازدید کننده http://example.com/shirt/summer?page=2 را تایپ کند،
با results.php?item=shirtamp;season=summeramp;page=2 پاسخ خواهد داد. بدون آن ، رشته پرس و جو اضافی حذف می شود.
در حالی که این روش به افکت مطلوب دست می یابد ، هر دو نام آیتم و فصل در قانون کدگذاری می شوند. این بدان معنی است که این قانون برای سایر موارد ، مانند شلوار ، یا فصولی مانند زمستان کار نخواهد کرد.
برای عمومی تر کردن این قاعده ، می توانیم از عبارات معمول برای مطابقت با قسمت های اصلی آدرس استفاده کنیم و از آن قسمت ها در الگوی تعویض استفاده کنیم. سپس قانون اصلاح شده به شرح زیر خواهد بود:
Simple substitution
RewriteRule ^([A-Za-z0-9]+)/(summer|winter|fall|spring) results.php?item=$1amp;season=$2 [QSA]
اولین گروه عبارت معمول در پرانتز با رشته ای حاوی کاراکترهای الفبا و اعداد مانند shirt یا pants مطابقت دارد و قطعه را به عنوان متغیر $ 1 ذخیره می کند. دومین گروه عبارت معمول در پرانتز دقیقاً با summer,winter,fall, یا spring مطابقت دارد و به همین ترتیب قطعه را به عنوان $2 ذخیره می کند.
قطعات همسان پس از آن به جای shirt و summer که قبلاً از آنها استفاده می کردیم در URL نتیجه در متغیرهای item و season استفاده می شوند.
موارد فوق ، به عنوان مثال ، http://example.com/pants/summer را به http://example.com/results.php؟item=pantsamp;season=summer تبدیل می کند. این مثال همچنین اثبات آینده است ، و به چندین item و season اجازه می دهد تا با استفاده از یک قانون واحد به طور صحیح بازنویسی شوند.
مثال 2 - اضافه کردن شرایط با منطق با استفاده ازRewriteConds
بازنویسی قوانین ااماً همیشه یک به یک و بدون محدودیت ارزیابی نمی شوند. دستورالعمل RewriteCond به ما امکان می دهد تا شرایط را برای بازنویسی خود اضافه کنیم تا هنگام پردازش قوانین ، کنترل کنیم. کلیه RewriteConds با فرمت زیر عمل می کند:
General RewriteCond structure
RewriteCond TestString Condition [Flags]
اگر RewriteCond درست ارزیابی شود ، RewriteRule بلافاصله در نظر گرفته می شود. در صورت عدم موفقیت ، این قانون منتفی می شود. RewriteCond چندگانه ممکن است یکی پس از دیگری مورد استفاده قرار گیرد و با رفتار پیش فرض ، همه باید درست ارزیابی کنند تا قاعده زیر در نظر گرفته شود.
به عنوان نمونه ، فرض می کنیم شما می خواهیئ به جای نشان دادن صفحه خطای استاندارد 404 Not Found ، همه درخواست ها را به فایل ها یا دیرکتوریهای غیر موجود در سایت خود به صفحه اصلی برگردانید. این امر می تواند با قوانین زیر انجام شود:
Redirect all requests to non-existent files and directories to home page
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . / [R=301]
به این شرح:
%{REQUEST_FILENAME} رشته ای برای بررسی است. در این حالت ، نام فایل درخواستی است ، که یک متغیر سیستمی برای هر درخواست است.
-f یک وضعیت داخلی است که تأیید می کند که آیا نام درخواست شده در دیسک وجود دارد یا فایل است. ! یک عامل منفی است. ! -f ترکیبی فقط درصورتی که یک نام مشخص وجود نداشته باشد یا فایل نداشته باشد ، درست ارزیابی می شود.
به طور مشابه ، ! -d فقط درصورتی که یک نام مشخص وجود نداشته باشد یا یک دیرکتوری نباشد ، درست ارزیابی می شود.
RewriteRule در خط نهایی فقط برای درخواست ها به فایل ها یا دایرکتوری های غیر موجود وارد خواهد شد. خود RewriteRule بسیار ساده است. نقطه . در این الگو با هر چیزی مطابقت دارد و جایگزینی هر درخواست را به ریشه / وب سایت هدایت می کند.
علاوه بر این ، پرچم [R = 301] به Apache می گوید یک کد پاسخ HTTP ،301 Moved Permanentlyرا به مرورگر بازگرداند ، در نتیجه مرورگر می داند که تغییر مسیر اتفاق افتاده است و صریحاً به جای URL درخواست شده ، ریشه وب سایت را واگذار می کند. و تغییری در نوار آدرس مرورگر اعمال میشود.
بدون این پرچم ، Apache محتوای اصلی وب سایت را بر می گرداند ، اما مرورگر همچنان فکر می کند URL صفحه درخواستی وجود داشته باشد و آدرس درخواست شده را ابتدا در نوار آدرس نشان دهد.
نتیجه
mod_rewrite به شما امکان می دهد URL های قابل خواندن توسط انسان را ایجاد کنید. در این آموزش شما از دستورالعمل RewriteRule برای هدایت آدرس های اینترنتی از جمله آدرس ها با رشته های پرس و جو استفاده کرده اید. همچنین با استفاده از دستورالعمل RewriteCond URL های هدایت شونده مشروط را نوشتید.
اگر می خواهید در مورد mod_rewrite اطلاعات بیشتری کسب کنید ، به mod_rewrite Introduction و مستندات رسمی Apache برای mod_rewrite نگاهی بیندازید.
درباره این سایت