با سلام به شما خوبان، حالتون که خوبه؟امروز به اموزش htaccess میپردازیم.به نقل از سایت رسمی آپاچی: فایل های .htaccess (ویا فایل های پیکربندی توزیع شده) روشی برای ایجاد تغییرات پیکربندی در سطح دایرکتوری ها فراهم می نمایند. هرفایل .htaccess شامل یک یا چند دستور آپاچی است که دایرکتیو نامیده می شوند. هر فایل .htaccess در یک دایرکتوری مشخص قرار می گیرد. دایرکتیوهای درون هر فایل .htaccess فقط روی همان دایرکتوری که فایل .htaccess درون آن قرار دارد به علاوه زیردایرکتوری های آن اعمال می شود.
تعریف دایرکتیو (directive)
دایرکتیو اصطلاحی است که آپاچی برای دستورات پیکربندی آپاچی از آن استفاده می کند. دستورات کوتاهی که معمولا به صورت جفت کلید-مقدار نوشته می شوند و رفتار آپاچی را تغییر می دهند. فایل های .htaccess برای توسعه دهندگان وب این امکان را مهیا می کنند تا دسته ای از این دایرکتیوها را در دایرکتوری دلخواه خود اجرا کنند بدون اینکه نیاز به دسترسی به فایل پیکربندی سرور هسته آپاچی که httpd.conf نامیده می شود داشته باشند. این فایل httpd.conf معمولا به عنوان «فایل پیکربندی سراسری » به آن استناد می شود.این ویژگی برای بسیاری از شرکت های میزبان وب که یک فضای میزبانی اشتراکی را مدیریت می کنند ویژگی بسیار ایده الی است. یک شرکت میزبانی وب هیچ وقت نمیاد دسترسی فایل پیکربندی اصلی سرور آپاچی رو برای مشتریانش باز بگذارد چراکه در این صورت هر تغییر در پیکربندی اصلی سرور ، روی فضای وب سایر مشتریان که روی همان سرور میزبانی می شوند اثر می گذارد و باعث به هم ریختگی و نارضایتی مشتریان می گردد. اما در عوض با فعال کردن .htaccess این قدرت را به مشتریان خود می دهند تا پیکربندی های دلخواه را با استفاده از دایرکتیوهای مجاز در فایل های .htaccess در سطح دایرکتوری پروژه وب خود اعمال کنند. بهتر است یادآور شویم که هر آنچه که با فایل های .htaccess محقق می شود می تواند با فایل اصلی پیکربندی سرور یعنی httpd.conf نیز انجام شود اما عکس این قضیه صحیح نیست. یعنی با فایل httpd.conf کارهایی نیزمی توان انجام داد که با فایل های .htaccess امکانش وجود ندارد. درحقیقت اصلا مجوز فعال بودن و قابل اجرا بودن فایل های .htaccess از طریق فایل httpd.conf فراهم می شود. علاوه بر این بعد از اینکه فایل های .htaccess از طریق فایل httpd.conf فعال شدند می توان قدرت آنها را نیز به «context» های خاصی در فایل httpd.conf محدود کرد. طوری که برخی دستورات آپاچی را بتوانند رونویسی کرده و تغییر دهند اما برخی دیگر را نتوانند. این ویژگی قدرت مدیران سیستم را برای کنترل مشتریان در استفاده از فایل های .htaccess بیشتر می کند.
فعال کردن فایل های .htaccess
فایل های .htaccess معمولا به صورت پیشفرض فعال هستند. و عملا از طریق دایرکتیو AllowOverride درون فایل httpd.conf فعال یا غیرفعال بودن آن کنترل می شود. این دایرکتیو تنها بایستی درون بخش های به شکل قرار گیرد. به عبارت ساده تر، فایل httpd.conf یک DocumentRoot ایجاد می کند و قسمت عمده این فایل شامل دستوراتی است که در بخش های قرار می گیرند و به این ترتیب روی همان دایرکتوری مشخص شده اعمال می شوند. و دستور AllowOverride درون همین بخش ها بریا دایرکتوری مورد نظر قرار داده می شود.مقدار پیش فرض برای کلید AllowOverride در این دستور، برابر با ALL است بنابراین فایل های .htaccess به صورت پیش فرض فعال هستند. مقدار دیگری که می تواند بگیرد None است که در این صورت فایل های .htaccess به کلی غیرفعال خواهند شد. مقادیر دیگری هم می تواند بگیرد تا تغییرات پیکربندی را برای Context های مشخصی محدود کند. برخی از این مقادیر به صورت زیر هستند:
AuthConfig: دایرکتیوهای احراز هویت از قبیل دستوراتی که با تصدیق هویت پایه سروکار دارند.
FileInfo: دایرکتیوهایی که برای تنظیم Headers، Error Documents، Cookies، URL Rewriting و غیره به کار می روند.
Indexes : سفارشی کردن فهرست بندی دایرکتوری پیشفرض
Limit: کنترل دسترسی به صفحات در برخی از روش ها
مثالی از مجوز رونویسی کامل برای .htaccess:
# Allow .htaccess files their full power
AllowOverride All
مثالی از مجوز رونویسی محدود به context های مشخص:
# Only allow .htaccess files to override Authorization and Indexes
AllowOverride AuthConfig Indexes
نکته۱: توضیحات در نگارش فایل های پیکربندی آپاچی، به صورت علامت # در ابتدای توضیح می آید.
نکته۲: گاهی اوقات حتی یک خطای کوچک در شیوه نگارش دستورات آپاچی (دایرکتیوها)، می تواند منجر به ایجاد خطای شماره ۵۰۰ برای کاربر بکند.که بیانگر خطای داخلی سرور است. به همین دلیل توصیه می شود قبل از انکه تغییری در فایل httpd.conf و یا فایل های .htaccess ایجاد کنید از فایل یک بکاپ تهیه کنید تا در صورتی که تغییرات جدید شما تولید خطا کرد بتوانید سریعا فایل پیکربندی قبلی را جایگزین کنید و تغییرات را به قبل بازگردانید.
چه موقع نباید از فایل های .htaccess استفاده کنیم؟
به عنوان یک قاعده کلی همیشه به یاد داشته باشید که تنها باید زمانی از فایل های .htaccess در دایرکتوری های پروژه وبتان استفاده کنید که امکان دسترسی تغییر روی فایل اصلی پیکربندی سرور (.httpd) وجود ندارد. برای مثال یک تصور غلطی که رایج شده است این است که اهراز هویت کاربر حتما باید توسط فایل های .htaccess انجام شود و به عنوان مثال دیگر تصور غلط دیگری که اخیرا شایع شده است بازنویسی url صفحات پروژه وب با استفاده از دستورات mod_Rewrite است که برخی توسعه دهندگان تاکید دارند که حتما درون فایل های .htaccess این دستورات درج و اجرا شوند. در حالی که این تصورات در حالت کلی غلط است و زمانی که دسترسی به فایل اصلی پیکربندی سرور وجود دارد بهتر است این دستورات نظیر اهراز هویت و بازنویسی URL و …. درون خود فایل اصلی پیکربندی سرور ثبت و پیکربندی شوند.به عبارت دیگر زمانی بایستی یک توسعه دهنده وب فایل های .htaccess را درون دایرکتوری های پروژه وب خود به کار گیرد که دسترسی root به سرور ندارد. در مواردی که مدیر سرور (Server Administrator) نمی خواهد خودش را مدام درگیر تغییرات مکرر پیکربندی کند که مدیران پروژه های مختلف وب روی همان سرور تقاضا می کنند ، در این شرایط بهتر است که مجوز اعمال تغییرات پیکربندی را در سطح دایرکتوری هر پروژه به خود مدیر آن پروژه اعطا کند و این کار از طریق فایل های .htaccess محقق می شود. در واقع فایل های .htaccess مختص همین هدف ساخته می شوند. برای مثال در مواردی که شرکت های ISP ، پروژه های وب چندین کاربر را روی یک ماشین میزبانی می کنند و می خواهند کاربرانشان قادر باشند پیکربندی های مورد نیاز خود را در سطح پروژه خودشان اعمال کنند از مزایای فایل های .htaccess استفاده می کنند. باز تاکید می شود که تمامی پیکربندی هایی که شما در فایل های .htaccess انجام می دهید قابل تنظیم در بخش های درون فایل اصلی پیکربندی سرور است. پس تا جایی که امکان دارد از فایل های .htaccess استفاده نکنید.
دو دلیل عمده برای این همه تاکید بر عدم استفاده از فایل های .htaccess در موارد عدم ضرورت وجود دارد:
الف: افت کارائی سرور آپاچی
زمانی که AllowOverride برای استفاده از فایل های .htaccess تنظیم می گردد، httpd در هر دایرکتوری از سرور به دنبال فایل های .htaccess می گردد. بنابراین صرف مجوز اجرای فایل های .htaccess منجر به یک افت کارایی می شود، حال خواه از فایل های .htaccess استفاده شود و خواه اصلا استفاده نشود. علاوه براین فایل های .htaccess هر بار که سندی از وب سایت توسط کلاینت درخواست می شود از نو بارگذاری می گردند که خود باعث کاهش سرعت و در نتیجه کاهش کارایی وب سایت می شود.و نیز به یاد داشته باشید که httpd باید به دنبال فایل های .htaccess حتی در دایرکتوری های سطوح بالاتر هم بگردد تا متمم های کاملی از دستورات پیکربندی که باید در نهایت اعمال شود گردآوری کند. بنابراین اگر برای مثال سندی از مسیر دایرکتوری wwwhtdocs/example درخواست شود، httpd بایستی دنبال همه فایل های زیر بگردد:
/ .htaccess
/www/.htaccess
/www/htdocs/.htaccess
/www/htdocs/example/.htaccess
و بنابراین برای هر سندی که خارج از مسیر جاری درخواست شود، ۴ دسترسی سیستم فایل اضافه تر باید انجام گیرد، حتی اگر هیچ کدام از فایل های .htaccess در دایرکتوری های مربوط به مسیر وجود نداشته باشند. (به یاد داشته باشید که این فقط در مواردی است که فایل های .htaccess برای / فعال شده باشند که معمولا اینگونه نیست) یک دلیل دیگر کاهش کارایی در زمان استفاده از فایل های .htaccess این است که با هربار درخواست یک سند وب، فایل های .htaccess مربوط به آن (از دایرکتوری جاری تا دایرکتوری root ) بایستی از نو کامپایل شوند در حالی که در مورد فایل اصلی پیکربندی سرور اینگونه نیست و دستورات درون فایل اصلی پیکربندی سرور تنها یک بار کامپایل می شوند و برای دسترسی های بعدی در حافظه cache قرار می گیرند. این مسئله مخصوصا در مورد برخی دستورات آپاچی که دارای پیچیدگی نیز هستند از جمله دستورات RewriteRule ، بغرنج تر هم می شود.
ب: افت امنیت سرور:
با اعطای مجوز پیکربندی با استفاده از فایل های .htaccess در واقع شما دارید مجوزی را اعطا می کنید که می تواند سبب پیکربندی هایی روی سرور شود که ممکن است از کنترل شما خارج باشد. بایستی به دقت در مورد دسترسی هایی که به کاربرانتان می دهید فکر کنید. از طرفی اگر به کاربرانتان دسترسی هایی کمتر از حد نیاز و ضرورت کارشان بدهید آنوقت مجبورید خودتان درخواست های پشتیبانی فنی بیشتری را که شامل تقاضای پیکربندی های مختلف خواهد بود پاسخگو باشید. در هر صورت چنانچه شما مدیر سرور (Server Administrator) هستید و به کاربرانتان مجوز می دهید بهتر است با آنها شفاف باشید. و خیلی شفاف دسترسی های آنها را به آنها اعلام نمائید. و به طور دقیق به آنها بگوئید که به چه دلیل AllowOverride را برای آنها تنظیم کرده اید و نیز آنها را به مستندات مربوطه ارجاع دهید، این کار از سردرگمی های آینده برای خودتان جلوگیری می کند.
توجه: قرار دادن فایل .htaccess شامل یک دستور آپاچی در مسیر wwwhtdocsexample معادل است با قراردادن همان دستور آپاچی در یک بلاک به صورت <Directory “wwwhtdocsexample”> در فایل اصلی پیکربندی سرور.برای مثال:
محتوای فایل .htaccess در مسیر wwwhtdocs/example:
AddType text/example “.exm”
و بخش Directory مربوطه در فایل httpd.conf:
AddType text/example “.exm”
عیب یابی و رفع خطا:
زمانی که شما دستورات پیکربندی آپاچی را در یک فالی .htaccess قرار می دهید اما هنگام اجرای درخواست های مربوطه نتیجه دلخواه را نمیبینید معنایش این است که احتمالا یک سری موارد را به درستی انجام نداده اید.متداول ترین مشکل این است که AllowOverride اصلا تنظیم نشده است تا مجوز اجرای فایل .htaccess وجود داشته باشد. پس ابتدا اطمینان حاصل کنید که مقدار AllowOverride برابر با none نباشد. یک تست خوب برای اطمینان از این امر این است که چند خط چرت و پرت توی فایل .htaccess اضافه کنید. اگر در اجرای درخواست سند مربوطه هیچ خطای سروری تولید نشد معنایش این است که مقدار AllowOverride برابر با none است به همین دلیل سرور آپاچی اصلا به سراغ فایل های .htaccess نمی رود چه برسد به اینکه بخواهد دستورات ان را کامپایل کرده و خطا تولید کند.
اما اگر خطای سرور تولید شد، باید بروید سراغ لاگ فایل خطای httpd و ان را چک کنید. اگر پیام خطا مشابه پیام زیر باشد معنایش این است که شما دستوری را در فایل .htaccess استفاده کردیه اید که اصلا مجوز اجرا در قالب فایل .htaccess را ندارد. و یا اینکه سطح دسترسی کافی برای دستور مورد نظر در متغیر AllowOverride تنظیم نشده است. برای بررسی اینکه خطای تولید شده به دلیل کدام اتفاق تولید شده است بایستی مستندات مربوط به دستور را بررسی کنید.
[Fri Sep 17 18:43:16 2010] [alert] [client 192.168.200.51] /var/www/html/.htaccess: DirectoryIndex not allowed here
و ممکن است خطای تولید شده بیانگر یک خطای نحوی در به کارگیری دستور باشد. مانند خطای زیر:
[Sat Aug 09 16:22:34 2008] [alert] [client 192.168.200.51] /var/www/html/.htaccess: RewriteCond: bad flag delimiters