ماژول mod_rewrite Apache به شما امکان مي دهد URL ها را با تميزتر بازنويسي کنيد ، مسيرهاي قابل خواندن توسط انسان را به رشته هاي پرس و جوي متناسب با کد تبديل کنيد. همچنين به شما امکان مي دهد URL ها را بر اساس شرايط بازنويسي کنيد.
فايل .htaccess به شما امکان مي دهد بدون دسترسي به فايل هاي پيکربندي
در اين آموزش ، mod_rewrite را فعال کرده و از فايلهاي .htaccess براي ايجاد يک تغيير مسير URL اصلي استفاده مي کنيد ، و سپس چند مورد استفاده پيشرفته را پيدا مي کنيد.
پيش نيازها
براي دنبال کردن اين آموزش ، به موارد زير نياز داريد:
مرحله 1 – فعال کردن mod_rewrite
براي اينکه Apache بتواند قوانين بازنويسي را درک کند ، ابتدا بايد mod_rewrite را فعال کنيم. قبلاً نصب شده است ، اما در نصب پيش فرض Apache غيرفعال است. براي فعال کردن ماژول از دستور a2enmod استفاده کنيد:
· $ sudo a2enmod rewrite·
با اين کار ماژول فعال مي شود يا به شما هشدار مي دهد که ماژول از قبل فعال شده است. براي اجراي اين تغييرات ، Apache را مجدداً راه اندازي کنيد.
· $ sudo systemctl restart apache2·
اکنون mod_rewrite کاملاً فعال است. در مرحله بعدي، يک فايل .htaccess را براي تعريف قوانين بازنويسي براي تغيير مسيرها تنظيم خواهيم کرد.
مرحله 2 – تنظيم .htaccess
يک فايل .htaccess به ما امکان مي دهد قوانين بازنويسي خود را بدون دسترسي به فايل هاي پيکربندي
توجه: هر قانوني که مي توانيد در يک فايل .htaccess قرار دهيد ، مي تواند مستقيماً در فايل هاي پيکربندي
با اين حال ، در اين مثال ساده ، افزايش عملکرد ناچيز خواهد بود. علاوه بر اين ، تنظيم قوانين در .htaccess مناسب است ، به خصوص با چندين وب سايت در همان
قبل از شروع استفاده از فايل هاي .htaccess ، بايد تنظيمات ديگري را انجام و آن را ايمن کنيد.
به طور پيش فرض ، Apache با استفاده از فايل .htaccess اعمال قوانين بازنويسي را ممنوع مي کند ، بنابراين ابتدا بايد تغييراتي در فايل اعمال کنيد. فايل پيش فرض پيکربندي Apache را با استفاده از nano يا ويرايشگر متن مورد علاقه خود باز کنيد.
· $ sudo nano /etc/apache2/sites-available/000-default.conf·
در داخل آن فايل ، بلوک <VirtualHost *: 80> را که از خط اول شروع مي شود ، پيدا خواهيد کرد. در داخل آن بلوک ، بلوک جديد زير را اضافه کنيد تا فايل پيکربندي شما مانند زير باشد. اطمينان حاصل کنيد که همه بلوک ها به درستي قرار گرفته اند.
/etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
<Directory /var/www/html>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
. . .
</VirtualHost>
فايل را ذخيره کنيد و ببنديد. براي اجراي اين تغييرات ، Apache را مجدداً راه اندازي کنيد.
· $ sudo systemctl restart apache2·
اکنون ، يک فايل .htaccess را در webroot ايجاد کنيد.
· $ sudo nano /var/www/html/.htaccess·
اين خط را در بالاي فايل جديد اضافه کنيد تا موتور بازنويسي فعال شود.
/var/www/html/.htaccess
RewriteEngine on
فايل را ذخيره کرده و خارج شويد.
اکنون ما يک فايل .htaccess عملياتي داريم که مي توانيم از آن استفاده کنيم تا قوانين مسيريابي برنامه وب را کنترل کنيم. در مرحله بعد ، ما فايلهاي وب سايت نمونه را ايجاد خواهيم کرد که براي نشان دادن قوانين بازنويسي قوانين از آنها استفاده خواهيم کرد.
مرحله 3 – پيکربندي بازنويسي URL
در اينجا ، يک بازنويسي URL اصلي را تنظيم مي کنيم که URL هاي زيبا را به مسيرهاي واقعي به صفحات تبديل مي کند. به طور خاص ، به کاربران اين امکان را مي دهيم که به http: // your_server_ip / about دسترسي پيدا کنند ، اما صفحه اي به نام about.html را نمايش مي دهند.
با ايجاد فايلي به نام about.html در webroot شروع کنيد.
· $ sudo nano /var/www/html/about.html·
کد HTML زير را در فايل کپي کنيد ، سپس آن را ذخيره کرده و ببنديد.
/var/www/html/about.html
<html>
<head>
<title>About Us</title>
</head>
<body>
<h1>About Us</h1>
</body>
</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 را باز کنيد.
· $ sudo nano /var/www/html/.htaccess·
بعد از اولين خط ، 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 اضافه مي شوند. پارامترهاي جداگانه با استفاده از چ (&) محدود مي شوند. رشته هاي جستار ممکن است براي انتقال داده هاي اضافي بين صفحات برنامه فردي استفاده شود.
به عنوان مثال ، يک صفحه نتيجه جستجو که به زبان PHP نوشته شده است ممکن است از URL مانند http://example.com/results.php؟item=shirt&season=summer استفاده کند. در اين مثال ، دو پارامتر اضافي به اسکريپت برنامه result.php موهومي منتقل مي شود: item ، با متغير shirt ، و مقدار summer. برنامه ممکن است از اطلاعات رشته پرس و جو براي ايجاد صفحه مناسب براي بازديد کننده استفاده کند.
قوانين بازنويسي Apache اغلب براي ساده کردن پيوندهاي طولاني و ناخوشايند مانند موارد فوق در URL هاي دوستانه که تايپ و تفسير بصري آسان تر است ، به کار مي روند. در اين مثال ، ما مي خواهيم لينک بالا را ساده کنيد تا به http://example.com/shirt/summer تبديل شويد. پارامتر shirt و summer هنوز در آدرس هستند اما بدون نام رشته و نام اسکريپت.
در اينجا يک قانون براي اجراي اين وجود دارد:
Simple substitution
RewriteRule ^shirt/summer$ results.php?item=shirt&season=summer [QSA]
shirt/summer به طور واضح در آدرس درخواستي مطابقت دارد و به Apache گفته مي شود که به جاي آن ، results.php?item=shirt&season=summer را ارائه دهد.
پرچم هاي [QSA] معمولاً در قوانين بازنويسي استفاده مي شوند. آنها به Apache مي گويند هر رشته درخواست اضافي را در URL ارائه شده اضافه کند ، بنابراين اگر بازديد کننده http://example.com/shirt/summer?page=2 را تايپ کند،
با results.php?item=shirt&season=summer&page=2 پاسخ خواهد داد. بدون آن ، رشته پرس و جو اضافي حذف مي شود.
در حالي که اين روش به افکت مطلوب دست مي يابد ، هر دو نام آيتم و فصل در قانون کدگذاري مي شوند. اين بدان معني است که اين قانون براي ساير موارد ، مانند شلوار ، يا فصولي مانند زمستان کار نخواهد کرد.
براي عمومي تر کردن اين قاعده ، مي توانيم از عبارات معمول براي مطابقت با قسمت هاي اصلي آدرس استفاده کنيم و از آن قسمت ها در الگوي تعويض استفاده کنيم. سپس قانون اصلاح شده به شرح زير خواهد بود:
Simple substitution
RewriteRule ^([A-Za-z0-9]+)/(summer|winter|fall|spring) results.php?item=$1&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=pants&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 نگاهي بيندازيد.
درباره این سایت