راهنمای استفاده از htaccess برای طراحان و توسعهدهندگان وب
راه های مختلفی برای مدیریت و تنظیم کردن هر چه بیشتر سایت مطابق سلیقه خودتان وجود دارد. با استفاده از htaccess میتوانید تنظیمات مختلفی در حوزه امنیت، محدود کردن دسترسی و غیره بدست آورید.
در میان ابزارهای موجود برای تغییر و سفارشیسازی سرور وب خود، فایل کانفیگ .htaccess یکی از برترینها است. میتوانید انواع مدارک، موتورهای تجزیهکننده و تغییر مسیرهای (URL Redirect) را همراه با بسیاری ویژگیهای کلیدی دیگر بهسرعت انجام دهید. ممکن است وبمسترهای تازهکار نخواهند فایل htaccess خود را مدیریت کنند. به آنها توصیه می کنیم، فراگیری دستورات و نحوه ویرایش این فایل را فرا بگیرند.
هر کسی که میخواهد وبسایت خودش را روی یک سرور Apache راهاندازی کند، قطعا میخواهد مدیریت فایل .htaccess خود را بداند. این فایل امکانات سفارشی کردن بسیاری در اختیارتان قرار میدهد و روی همه زبانهای نوشتاری وب از PHP گرفته تا Ruby میتواند کار کند.
در انتهای این مقاله نیز چند اپلیکیشن وب دیگر معرفی میکنیم که تازهکارها میتوانند فایل .htaccess خود را بسازند.
چرا باید از یک فایل .htaccess استفاده کنیم؟
سوال مهمی که باید کار را با پاسخ به آن شروع کنیم این است که: «فایل htaccess چیست؟» . یک فایل تنظیمات بسیار خاص است که توسط سرور وب Apache استفاده میشود. یک فایل .htaccess میتواند به وب سرور بگوید که انواع مختلف اطلاعات را چطور نمایش دهد و چگونه به سربرگهای متعدد درخواستهای HTTP رسیدگی کند.
در واقع وسیلهای برای تمرکززدایی است تا تنظیمات سرور وب را سازماندهی کند. ممکن است یک سرور فیزیکی بیش از ۵۰ وب سایت مختلف را که هر کدام فایل .htaccess خود را دارند در خود جای داده باشد. این قدرت فراوانی به وبمسترها میدهد که از راهی دیگر نمیتوانستند بدست آورند. اما چرا لازم است از این فایل استفاده کنیم؟
اصلیترین دلیل، امنیت است. میتوانید چند دایرکتوری خاص را از دسترسی خارج کنید یا برایشان رمز عبور بگذارید. این کار برای پروژههای خصوصی یا برای استفاده در سیستمهای مدیریت محتوای جدید که میخواهید امنیت بیشتری داشته باشید بسیار عالی است. اما دستورهای رایج مانند تغییر مسیر پیامهای خطای ۴۰۴ به یک صفحه وب خاص نیز وجود دارند. این امر تنها به اندازه یک خط کدنویسی فضا لازم دارد اما میتواند اثر بالایی روی بازخورد بازدیدکنندگان نسبت به صفحات گم شده داشته باشد.
حقیقتش را بخواهید چیز زیادی نمیتوان برای متقاعد کردن افراد گفت تا باور کنند که شناخت فایل .htaccess ارزشش را دارد. وقتی عملکرد آن را ببینید، آن وقت به ارزشهایی که همراه با این فایل کانفیگ کوچک است پی میبرید. امیدواریم ادامه متن بتواند چند موضوع قابل توجه به شما ارائه کند و وبمسترها را از اهمیت مدیریت تنظیمات .htaccess آگاه کند.
اجازه دادن یا مسدود کردن دسترسی
شناخت بازدیدکنندههای مخرب احتمالی و مسدود کردن دسترسی آنها به وبسایتتان، از طریق این فایل امکانپذیر است. شاید این کار کمی سخت باشد، اما اگر میدانید که فرد یا گروهی از افراد مدتی است سایت شما را هدف قرار دادهاند، چند راه پیش رو دارید. می توانید از یک ارجاع دامین (domain referral) استفاده کنید تا بازدیدکنندگان را توسط آدرس IP شان مسدود کنید:
order allow,deny deny from 255.0.0.0 deny from 123.45.6. allow from all
کدهای بالا نمونهای از یک راهنمای برای استفاده از این روش هستند. دقت کنید که دومین آدرس IP، چهارمین عدد را ندارد. این کد بلاک کردن، اولین IP (یعنی ۲۵۵.۰.۰.۰) و همه IPهای داخل محدود ۱۲۳.۴۵.۶.۰-۲۵۵ را شامل میشود و به بقیه اجازه دسترسی میدهد. شاید وبمسترها از آن به اندازه دیگر تکنیکها استفاده نکند اما دانستن آن مفید است.
جلوگیری از فهرست کردن دایرکتوری
گاهی رخ میدهد که یک دایرکتوری باز دارید که روی تنظیمات اجازه بازدید بصورت پیشفرض تنظیم شده است. این یعنی کاربران میتوانند تمام فایلهای فهرست شده در ساختار دایرکتوری داخلی مانند فولدر تصاویرتان را ببینند. بعضی از وبمسترها نمیخواهند داریکتوریها فهرست شوند، خوشبختانه کد مناسب این کار را براحتی میتوانید در یاد نگه دارید:
Options -Indexes
این راهحل را بارها در Stack Overflow مختلف دیدهایم و احتمالا یکی از سادهترین قوانین در یادگیری .htaccess است.
ایجاد چند فایل .htaccess داخل هر یک از این دایرکتوریها امکان پذیر است، پس شاید یکی از آنها دارای رمز باشد و بقیه نداشته باشند. همچنین میتوانید کد Options-indexes را هم نگه دارید تا بازدیدکنندگان نتوانند محتویات فولدر website /images شما را ببینند.
رمزگذاری
رمگذاری برای دایرکتوریهایتان یکی از روشهای رایج برای تامین امنیت نواحی مدیریتی و فولدرهای مهم وبسایت شما است. گاهی شاید فقط بخواهید به گروهی کوچکی از افراد اجازه دسترسی دهید. گاهی استفاده از رمز برای جلوگیری از هکرها و دسترسی آنها به پنل مدیریتی سایت است. در هر حال، رمزگذاری یکی از راههای بسیار قدرتمند برای حل بسیاری از مشکلات است.
میتوانید از راهنماهای موجود در مورد رمزگذاری استفاده کنید تا کدهای مهم را بشناسید. لاید یک فایل رمز ایجاد کنید که اطلاعات نام کاربری/رمز عبور را در خود ذخیره میکند. Apache به همین روش اطلاعات ورودی کاربر را بررسی میکند تا تشخیص دهد اجازه دسترسی به فرد داده شود یا خیر. همچنین دقت کنید که چگونه باید یک نمونه از نام کاربری و رمز عبور خود ایجاد کنید.
برای کار ابزار htpassword generator را پیشنهاد میکنیم تا در وقتتان هم صرفهجویی شود. سینتکس خروجی بی نقص است و نیازی ندارید رمز عبور را خودتان تغییر دهید. یک راه بسیار خوب دیگر این است که تمام یک فهرست دایرکتوری را رمزگذاری کنید. میتوانید نمونه ای از آن را مشاهده کنید.
AuthType Basic AuthName "This Area is Password Protected" AuthUserFile /full/path/to/.htpasswd Require valid-user
امنیت در ورد پرس
برای استفاده بهینه از روش رمزگذاری، بیایید یک مثال واقعی را بررسی کنیم. این کد که کمی پیچیدهتر است، از هر کس که به فایل wp-login.php ورد پرس دسترسی یابد میخواهد که هویت کاربریاش را احراز کند. منبع اصلی این روش را میتوانید در Ask Apache به همراه دیگر کدهای حفاظتی ورد پرس مشاهده کنید.
<Files wp-login.php> Order Deny,Allow Deny from All Satisfy Any AuthName "Protected By AskApache" AuthUserFile /web/askapache.com/.htpasswda1 AuthType Basic Require valid-user </Files>
اگر قصد دارید از این اصول .htaccess پیروی کنید، باید برای ناحیه مدیریتی هم یک رمز بگذارید. عموما افرادی که سعی دارند به زور وارد سیستم شما شوند، بیش از هر چیز به فایل wp-login.php حمله میکنند. بنابراین همین چند کدی که بالاتر مثال زدیم میتواند امنیت کاملی برای وب سایت ورد پرس شما فراهم کند.
قوانین بازنویسی HTTP URL
بازنویسی URLها یکی از رایج ترین کاربردهای فایل های .htaccess است. به کمک امکانات موجود پیشفرض در ورد پرس میتوانید یک فایل .htaccess را از همان پنل مدیریت بسازید. این به شما اجازه میدهد URLهای قشنگی بسازید که ساختار .php?p=1 هم ندارند.
بد نیست نگاهی به نمونههایی از این بازنویسیها بیاندازید تا روش تبدیل خط زیرین به خط تیره را بیاموزید، چون شامل بخش زیادی از عناصر مهم هستند.
Options +FollowSymLinks RewriteEngine On RewriteBase / RewriteRule !\.(html|php)$ - [S=4] RewriteRule ^([^_]*)_([^_]*)_([^_]*)_([^_]*)_(.*)$ $1-$2-$3-$4-$5 [E=uscor:Yes] RewriteRule ^([^_]*)_([^_]*)_([^_]*)_(.*)$ $1-$2-$3-$4 [E=uscor:Yes] RewriteRule ^([^_]*)_([^_]*)_(.*)$ $1-$2-$3 [E=uscor:Yes] RewriteRule ^([^_]*)_(.*)$ $1-$2 [E=uscor:Yes] RewriteCond %{ENV:uscor} ^Yes$ RewriteRule (.*) http://d.com/$1 [R=301,L]
تقریبا همیشه میتوان RewriteEngine و RewriteBase را مطابق این دستورها تنظیم کرد. اما باید RewriteEngine برای همه چیز روشن باشد تا کار کند. راهنماهای آنلاین متعددی در خصوص نحوه فعال کردن mod_rewrite وجود دارد.
دقت کنید که سینتکس از یک الگوی RewriteRules در بالا پیروی میکند. از این اصول برای هماهنگی با مواردی که بعنوان یک درخواست HTTP ارسال شده اند استفاده میشود. به آنها توسط یک RewriteRule پاسخ داده میشود که در این مثال، همه چیز را به یک دامین دیگر d.com تغییر مسیر میدهد. کروشههای انتهایی مانند [R=301,L] را پرچمهای بازنویسی (rewrite flags) مینامند که اهمیت زیادی دارند اما در واقع یک امکان اضافه هستند.
سینتکس mod_rewrite کمی گیچکننده است اما نترسید. قطعهها در مثالهای دیگر بسیار سادهتر بنظر میرسند.
پیشنهاد میکنیم حتما از این اپلیکیشن وب mod_rewrite استفاده کنید.
به کمک آن میتوانید نمونه کدهایی با استفاده از URLهای حقیقی بسازید. این ابزار شگفتانگیزی است چون میتوانید در سینتکس چندین مورد را بررسی کنید و ببینید چه عملکردی در قوانین بازنویسی دارند. این نمونهای ساده از این نوع است:
RewriteRule ^dir/([0-9]+)/?$ /index.php?id=$1 [L]
سعی نکنید همه این مطالب را با هم فرا بگیرید. احتمالا ۳ الی ۴ ماه زمان خواهد برد تا واقعا با نحوه بازنویسی URL ها با [۰-۹a-zA-Z]+ و الگوهای مشابه آشنا شوید. تمرین را ادامه دهید و به شما قول میدهیم بعد از تمرینات کافی به راحتی موضوعات بدیهی آنها را در ذهن داشته باشید.
قطعههای کد برای وبمسترها
ما عاشق قطعه هایی با کاربرد آسان هستیم و میخواهیم مجموعهای کوچک از کدهای مربوط به .htaccess را برای وبمسترها ارائه کنیم. هر یک از این ایده ها میتواند در کنار دیگر کدهای بلوک کردن برای فایل .htaccess شما مناسب باشد. اکثر این قطعهها برای حل سریع مشکلات یا خطاهای موجود در محیط سرور وب کاربرد دارند. تصویر کنید که یک تنظیم عالی Apache برای وبمسترهای جدیدی فراهم شده است که به تازگی در فضای آنلاین شروع به کار کردهاند.
تنظیم فهرست دایرکتوری
دستور مربوط به فهرست دایرکتوری 0DirectoryIndex) معمولا در یک خط استفاده میشود. میتوانید به Apache بگویید با کدام فایلها همانند فایلهای «اصلی» برخورد کند. بطور پیشفرض فایلهایی مانند index.html، index.php، index.asp و دیگر فایلهای فهرستی را انتخاب میکند. اما با استفاده از این قطعه کد که در زیر میبینید، میتوانید این مدرک اصلی را به هر چه میخواهید تبدیل کنید:
DirectoryIndex index.html index.cgi index.php
ترتیب مدارک باید از مهمترین مدرک شروع شود و به سمت مدارک با اهمیت کمتر ادامه پیدا کند. در نتیجه اگر یک فایل HTML یا CGI نداشتیم، در بازگشت به index.php بر میگردد. حتی میتوانید نام این فایلها را همانند home.php یا someotherfile.php که همگی سینتکسهای شناخته شدهای هستند انتخاب کنید.
قرار دادن دامین با www یا بدون www
اگر بین www.domain.co و یا فقط domain.com انتخاب نکرده باشید، گوگل میتواند با هر دو نسخه از دامین وبسایت شما کار کند. اما تجربه نشان داده است که بهتر است یکی از آنها را انتخاب کرده و بکمک .htaccess بعنوان تنها گزینه موجود مشخص کنید. به این ترتیب گوگل URLهای مختلفی را که برخی به دامین فرعی www اشاره دارند اما برخی ندارند فهرست نخواهد کرد.
# Force WWW Subdomain RewriteEngine On RewriteCond %{HTTP_HOST} ^domain.com [NC] RewriteRule ^(.*)$ http://www.domain.com/$1 [L,R=301] # No Subdomain RewriteEngine On RewriteCond %{HTTP_HOST} !^domain.com$ [NC] RewriteRule ^(.*)$ http://domain.com/$1 [L,R=301]
این قطعههای کد از یک مجموعه CSS-Tricks گرفته شده است و راهحلی بسیار کاربردی ارائه میکند. بهتر است دامین خود را به هر شکلی که برای سایتتان بهتر است تغییر دهید. در غیر این صورت مشکلاتی بوجود خواهد آمد که بلافاصله متوجهشان میشوید. اما باز هم اکیدا توصیه میکنیم تنها یکی از این دو گزینه را انتخاب کنید و آن را در اولویت اول بعد از راهاندازی یک وبسایت میدانیم.
دانلود اجباری فایلهای چند رسانهای
برخی دیگر از قطعه کدهای مهم، به برخی انواع فایل های چندرسانهای بجای اینکه فقط در مرورگر نمایش داده شوند،اجازه دانلود اجباری را میدهند. اولین مثالی که به ذهن میرسد فایلهای PDF و فایلهای صوتی MP3 است که با قابلیت دانلود نمایش داده میشوند، اما چطور مطمئن شویم قابل دانلود هستند؟ برای این موضوع توانستیم قطعه کد زیر را بدست آوریم:
AddType application/octet-stream .zip .mp3 .mp4
میتوانید در صورت دلخواه انواع فایلهای دیگری را هم به انتهای این کد اضافه کنید. همه فایلهای چند رسانهای که از نوع octet-stream MIME استفاده میکنند، قبل دانلود خواهند بود. اجبار این کار از طریق فایل .htaccess راهی مستقیم برای اطمینان از این است که مردم قادر به مشاهده این فایلها روی مرورگر نباشند.
مدارک خطای سفارشی
آخرین نکتهای که میخواهیم اضافه کنیم، یک قالب کامل از مدارک خطای سفارشی است. معمولا این کدهای عددی تنها در سمت سرور دیده میشوند. اما مدارک خطای فراونی هستند که بهتر است با آنها آشنا باشید. چند نمونه از آنها را میتوان خطاهای ۴۰۳/۴۰۴ و تغییر مسیر ۳۰۱ نام برد.
این قالب کدهای خطا از شماره ۱۰۰ شروع شده و تا خطای ۵۰۰ ادامه پیدا می کند. لطفا توجه داشته باشید که لزوما به همه آنها احتیاجی ندارید. فقط رایجترین آنها را باید بشناسید و احتمالا بد نیست در صورت نیاز چند قطعه که برایتان مبهم است را هم بررسی کنید.
اگر نتوانستید کد خاصی را بشناسید کافی است آن را در Wikipedia جستجو کنید.
ErrorDocument 100 /100_CONTINUE ErrorDocument 101 /101_SWITCHING_PROTOCOLS ErrorDocument 102 /102_PROCESSING ErrorDocument 200 /200_OK ErrorDocument 201 /201_CREATED ErrorDocument 202 /202_ACCEPTED ErrorDocument 203 /203_NON_AUTHORITATIVE ErrorDocument 204 /204_NO_CONTENT ErrorDocument 205 /205_RESET_CONTENT ErrorDocument 206 /206_PARTIAL_CONTENT ErrorDocument 207 /207_MULTI_STATUS ErrorDocument 300 /300_MULTIPLE_CHOICES ErrorDocument 301 /301_MOVED_PERMANENTLY ErrorDocument 302 /302_MOVED_TEMPORARILY ErrorDocument 303 /303_SEE_OTHER ErrorDocument 304 /304_NOT_MODIFIED ErrorDocument 305 /305_USE_PROXY ErrorDocument 307 /307_TEMPORARY_REDIRECT ErrorDocument 400 /400_BAD_REQUEST ErrorDocument 401 /401_UNAUTHORIZED ErrorDocument 402 /402_PAYMENT_REQUIRED ErrorDocument 403 /403_FORBIDDEN ErrorDocument 404 /404_NOT_FOUND ErrorDocument 405 /405_METHOD_NOT_ALLOWED ErrorDocument 406 /406_NOT_ACCEPTABLE ErrorDocument 407 /407_PROXY_AUTHENTICATION_REQUIRED ErrorDocument 408 /408_REQUEST_TIME_OUT ErrorDocument 409 /409_CONFLICT ErrorDocument 410 /410_GONE ErrorDocument 411 /411_LENGTH_REQUIRED ErrorDocument 412 /412_PRECONDITION_FAILED ErrorDocument 413 /413_REQUEST_ENTITY_TOO_LARGE ErrorDocument 414 /414_REQUEST_URI_TOO_LARGE ErrorDocument 415 /415_UNSUPPORTED_MEDIA_TYPE ErrorDocument 416 /416_RANGE_NOT_SATISFIABLE ErrorDocument 417 /417_EXPECTATION_FAILED ErrorDocument 422 /422_UNPROCESSABLE_ENTITY ErrorDocument 423 /423_LOCKED ErrorDocument 424 /424_FAILED_DEPENDENCY ErrorDocument 426 /426_UPGRADE_REQUIRED ErrorDocument 500 /500_INTERNAL_SERVER_ERROR ErrorDocument 501 /501_NOT_IMPLEMENTED ErrorDocument 502 /502_BAD_GATEWAY ErrorDocument 503 /503_SERVICE_UNAVAILABLE ErrorDocument 504 /504_GATEWAY_TIME_OUT ErrorDocument 505 /505_VERSION_NOT_SUPPORTED ErrorDocument 506 /506_VARIANT_ALSO_VARIES ErrorDocument 507 /507_INSUFFICIENT_STORAGE ErrorDocument 510 /510_NOT_EXTENDED