مقدمه: چرا htaccess یک ابزار حیاتی برای هر مدیر سایت است؟
فایل .htaccess یکی از قدرتمندترین ابزارهای مدیریت سرور در سطح دایرکتوری است که در وبسرورهای Apache استفاده میشود. با استفاده از این فایل متنی ساده، میتوانید رفتار سرور را بدون نیاز به دسترسی به فایلهای اصلی تنظیمات Apache تغییر دهید. از ریدایرکتهای 301 گرفته تا فشردهسازی فایلها، کش مرورگر و محافظت از فایلهای حساس، همه و همه با چند خط کد در htaccess قابل انجام است. در این مقاله، قواعد کاربردی و عملی را بررسی میکنیم که هر مدیر سایتی باید بداند. اگر از هاست اشتراکی یا سرور مجازی استفاده میکنید، احتمالاً Apache بهعنوان وبسرور اصلی شماست و این قواعد برایتان کارآمد خواهد بود. سرورنت نیز در سرویسهای هاستینگ خود از Apache پشتیبانی میکند، اما تمرکز این مقاله بر روی تکنیکهای عمومی و مستقل از ارائهدهنده است.
ریدایرکتهای هوشمند با htaccess
ریدایرکتها یکی از رایجترین کاربردهای htaccess هستند. چه بخواهید یک صفحه قدیمی را به صفحه جدید منتقل کنید، چه دامنه را تغییر دهید، یا کاربران را از HTTP به HTTPS هدایت کنید، .htaccess بهترین گزینه است.
ریدایرکت 301 دائمی
ریدایرکت 301 به موتورهای جستجو میگوید که صفحه بهطور دائمی جابجا شده است. این کار برای حفظ رتبه SEO و جلوگیری از خطای 404 ضروری است. مثال ساده:
Redirect 301 /old-page.html https://example.com/new-page.html
اگر نیاز به ریدایرکت کل دایرکتوری دارید:
RedirectMatch 301 /old-directory/(.*) https://example.com/new-directory/$1
در اینجا $1 بخشی از URL اصلی را نگه میدارد و به مقصد منتقل میکند.
ریدایرکت از HTTP به HTTPS
برای امنیت و سئو بهتر، همه کاربران باید به نسخه HTTPS سایت هدایت شوند. کد زیر را در فایل .htaccess ریشه سایت قرار دهید:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
این کد ابتدا بررسی میکند که آیا HTTPS فعال نیست، سپس درخواست را به نسخه امن هدایت میکند.
ریدایرکت دامنه www به non-www (یا برعکس)
برای یکپارچگی دامنه، یکی از نسخهها را انتخاب کنید. مثال برای هدایت www به non-www:
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
و برای برعکس (non-www به www):
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
اشتباه رایج: فراموش کردن RewriteEngine On در ابتدای کدهای RewriteRule. بدون این خط، هیچکدام از قوانین بازنویسی کار نمیکنند.
فشردهسازی Gzip برای افزایش سرعت بارگذاری
فشردهسازی فایلهای HTML، CSS، JavaScript و حتی فونتها قبل از ارسال به مرورگر، حجم انتقال را تا ۷۰٪ کاهش میدهد. این کار مستقیماً روی سرعت سایت و تجربه کاربری تأثیر میگذارد.
فعالسازی Gzip با htaccess
کد زیر را به فایل .htaccess اضافه کنید:
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/x-javascript application/json application/xml
AddOutputFilterByType DEFLATE image/svg+xml font/ttf font/otf font/woff font/woff2
</IfModule>
این کد به سرور میگوید که انواع فایلهای مشخص شده را با الگوریتم Deflate فشرده کند. ماژول mod_deflate معمولاً در هاستهای Apache فعال است.
تست فشردهسازی
برای اطمینان از فعال بودن فشردهسازی، میتوانید از ابزارهای آنلاین مانند checkgzipcompression.com استفاده کنید یا با دستور curl در ترمینال:
curl -H "Accept-Encoding: gzip" -I https://example.com
اگر در پاسخ هدر Content-Encoding: gzip را دیدید، فشردهسازی فعال است.
نکته عیبیابی: اگر فشردهسازی کار نمیکند، مطمئن شوید ماژول mod_deflate روی سرور فعال است. در برخی هاستهای اشتراکی، ممکن است نیاز به درخواست از پشتیبانی داشته باشید.
کش مرورگر با htaccess
کش مرورگر به کاربران اجازه میدهد فایلهای استاتیک (تصاویر، CSS، JS) را در حافظه محلی ذخیره کنند تا در بازدیدهای بعدی نیازی به دانلود مجدد نباشد. این کار سرعت بارگذاری را بهطور چشمگیری افزایش میدهد.
تنظیم هدرهای Cache-Control
کد زیر را به .htaccess اضافه کنید:
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType image/webp "access plus 1 year"
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
ExpiresByType text/javascript "access plus 1 month"
ExpiresByType application/x-javascript "access plus 1 month"
ExpiresByType image/x-icon "access plus 1 year"
ExpiresByType font/ttf "access plus 1 year"
ExpiresByType font/otf "access plus 1 year"
ExpiresByType font/woff "access plus 1 year"
ExpiresByType font/woff2 "access plus 1 year"
</IfModule>
این تنظیمات به مرورگر میگویند که تصاویر را یک سال و فایلهای CSS و JS را یک ماه در کش نگه دارد. اعداد را میتوانید بر اساس نیاز خود تغییر دهید.
استفاده از Cache-Control به جای Expires
روش مدرنتر استفاده از هدر Cache-Control است:
<IfModule mod_headers.c>
<FilesMatch "\.(ico|jpg|jpeg|png|gif|webp|svg|woff|woff2|ttf|eot)$">
Header set Cache-Control "max-age=31536000, public"
</FilesMatch>
<FilesMatch "\.(css|js)$">
Header set Cache-Control "max-age=2592000, public"
</FilesMatch>
</IfModule>
در اینجا max-age بر حسب ثانیه است: ۳۱۵۳۶۰۰۰ ثانیه معادل یک سال و ۲۵۹۲۰۰۰ ثانیه معادل یک ماه.
اشتباه رایج: تنظیم مدت زمان کش خیلی طولانی برای فایلهایی که مرتباً تغییر میکنند (مثل فایلهای CSS اصلی). اگر فایل CSS را تغییر دهید و کاربر کش قدیمی را داشته باشد، سایت خراب نمایش داده میشود. راه حل: استفاده از versioning در نام فایلها (مثلاً style.v2.css) یا تنظیم مدت زمان کوتاهتر برای فایلهای پویا.
محافظت از فایلهای حساس با htaccess
فایلهای مهمی مانند wp-config.php در وردپرس، .env در لاراول، یا فایلهای پیکربندی پایگاه داده نباید مستقیماً در مرورگر قابل مشاهده باشند. htaccess ابزارهای سادهای برای این کار فراهم میکند.
مسدود کردن دسترسی به فایلهای خاص
برای جلوگیری از دسترسی به فایلهای حساس، از کد زیر استفاده کنید:
<FilesMatch "\.(env|config|sql|log|bak|old|inc)$">
Order allow,deny
Deny from all
</FilesMatch>
این کد دسترسی به فایلهایی با پسوندهای مشخص را برای همه کاربران مسدود میکند. میتوانید پسوندهای بیشتری اضافه کنید.
محافظت از دایرکتوریهای حساس
برای دایرکتوریهایی مثل /includes یا /uploads که نباید مستقیماً فهرست شوند:
Options -Indexes
این خط ساده از نمایش لیست فایلهای دایرکتوری جلوگیری میکند. اگر کاربر به دایرکتوری بدون فایل ایندکس دسترسی پیدا کند، بهجای لیست فایلها، خطای 403 Forbidden دریافت میکند.
مسدود کردن IPهای خاص
اگر میخواهید دسترسی یک IP خاص را مسدود کنید:
Order Allow,Deny
Allow from all
Deny from 192.168.1.100
Deny from 10.0.0.0/8
در اینجا 192.168.1.100 یک IP مشخص و 10.0.0.0/8 یک رنج IP است.
محافظت با رمز عبور (Basic Authentication)
برای محافظت از یک دایرکتوری خاص با رمز عبور:
- یک فایل
.htpasswdدر خارج از دایرکتوری عمومی ایجاد کنید (مثلاً در/home/user/.htpasswd). - نام کاربری و رمز عبور را با دستور
htpasswdاضافه کنید:htpasswd -c /home/user/.htpasswd admin - در فایل
.htaccessدایرکتوری مورد نظر، کد زیر را اضافه کنید:
AuthType Basic
AuthName "Restricted Area"
AuthUserFile /home/user/.htpasswd
Require valid-user
این روش برای بخشهای مدیریتی یا استیجینگ سایت بسیار مفید است.
نکته امنیتی مهم: فایل .htpasswd را هرگز در دایرکتوری عمومی (مثل public_html) قرار ندهید. در غیر این صورت، کاربران میتوانند با حدس زدن مسیر، فایل رمز عبور را دانلود کنند.
تنظیمات پیشرفته: مسدود کردن هاتلینک و رباتهای مزاحم
هاتلینک (Hotlinking) زمانی رخ میدهد که سایتهای دیگر از تصاویر شما بدون اجازه استفاده میکنند و پهنای باند شما را مصرف میکنند. با htaccess میتوانید این کار را مسدود کنید.
جلوگیری از هاتلینک تصاویر
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https://(www\.)?example\.com [NC]
RewriteRule \.(jpg|jpeg|png|gif|webp)$ - [F,NC]
در این کد، example.com را با دامنه خود جایگزین کنید. این قانون به مرورگرهایی که از دامنههای دیگر به تصاویر شما لینک میدهند، خطای 403 Forbidden برمیگرداند.
مسدود کردن رباتهای بد
برخی رباتها (مثل scrapers) منابع سرور را مصرف میکنند. میتوانید آنها را با User-Agent مسدود کنید:
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} (ahrefsbot|mj12bot|semrushbot) [NC]
RewriteRule .* - [F,L]
این کد رباتهای Ahrefs، Majestic و Semrush را مسدود میکند. میتوانید لیست را با نام رباتهای دیگر گسترش دهید.
نتیجهگیری
فایل .htaccess یک ابزار قدرتمند و انعطافپذیر است که با چند خط کد میتواند عملکرد، امنیت و سرعت سایت شما را بهبود بخشد. از ریدایرکتهای هوشمند گرفته تا فشردهسازی و کش مرورگر، همه این تنظیمات بدون نیاز به تغییر در کدهای اصلی سایت قابل انجام هستند. به یاد داشته باشید که همیشه قبل از اعمال تغییرات، از فایل .htaccess اصلی یک نسخه پشتیبان تهیه کنید. اگر از هاست اشتراکی استفاده میکنید و با خطای 500 Internal Server Error مواجه شدید، کافی است فایل را با FTP بازگردانید. با تمرین و استفاده از مثالهای این مقاله، میتوانید کنترل بیشتری روی سرور خود داشته باشید و تجربه بهتری برای کاربران خود فراهم کنید.
دیدگاهها ۰
هنوز دیدگاهی ثبت نشده؛ اولین نفر باشید!