آموزش کامل فایل .htaccess

از مبتدی تا پیشرفته – امنیت، ریدایرکت، کش و تنظیمات Apache

فایل .htaccess چیست؟

فایل متنی مخفی (با نقطه اول در نام) که در پوشه‌های سایت قرار می‌گیرد و به سرور Apache دستور می‌دهد چگونه رفتار کند. این فایل قدرتمندترین ابزار تنظیمات بدون نیاز به دسترسی root است.

کاربردهای اصلی:

نکته مهم: .htaccess فقط در سرورهای Apache کار می‌کند. در Nginx یا LiteSpeed باید از فایل‌های کانفیگ جداگانه استفاده کنید.

چگونه فایل .htaccess بسازیم؟ (گام‌به‌گام)

  1. به فایل منیجر هاست (cPanel → File Manager) یا برنامه FTP (FileZilla) بروید
  2. به پوشه اصلی سایت بروید (معمولاً public_html یا www)
  3. گزینه New File را بزنید و نام فایل را دقیقاً .htaccess بگذارید (نقطه اول ضروری است)
  4. فایل را باز کنید، کدهای مورد نظر را کپی کنید
  5. ذخیره کنید و سایت را رفرش کنید (Ctrl + F5 برای پاک کردن کش)
هشدار: اگر نام فایل اشتباه باشد (مثل htaccess بدون نقطه یا .htaccess.txt)، سرور آن را نادیده می‌گیرد و هیچ‌کدام از تنظیمات اعمال نمی‌شود.

۱. محافظت از فایل‌های حساس (اولین و مهم‌ترین قانون امنیتی)

<Files \~ "^\.ht">
    Require all denied
</Files>

<!-- روش قدیمی‌تر (سازگار با Apache 2.2 و قبل) -->
<Files ".htaccess">
    Order allow,deny
    Deny from all
</Files>

<!-- محافظت گسترده از فایل‌های خطرناک دیگر -->
<FilesMatch "\.(env|bak|old|\~|\.swp|\.dist|\.log|\.sql|\.ini|\.gitignore|composer\.json|composer\.lock)$">
    Require all denied
</FilesMatch>

توضیح فنی: این دستور دسترسی مستقیم به تمام فایل‌هایی که با .ht شروع می‌شوند (مانند .htaccess، .htpasswd) و همچنین فایل‌های حساس دیگر (مانند .env که حاوی رمز دیتابیس است) را ممنوع می‌کند. اگر کسی سعی کند این فایل‌ها را از مرورگر ببیند، خطای 403 (Forbidden) دریافت می‌کند.

برای مبتدی: این اولین خطی است که باید در هر .htaccess بگذارید. بدون آن، تنظیمات امنیتی شما ممکن است افشا شود.

۲. جلوگیری از نمایش لیست فایل‌ها در پوشه (Directory Listing)

Options -Indexes

توضیح: وقتی یک پوشه فایل index (مثل index.html یا index.php) نداشته باشد، سرور Apache به‌صورت پیش‌فرض لیست تمام فایل‌های داخل آن پوشه را نشان می‌دهد. این خط آن رفتار را غیرفعال می‌کند و به جای لیست، خطای 403 نمایش داده می‌شود.

فایده امنیتی: هکرها دیگر نمی‌توانند با وارد کردن آدرس پوشه‌ها (مثل /uploads/ یا /backup/) به دنبال فایل‌های حساس بگردند.

۳. اضافه کردن هدرهای امنیتی مهم (Security Headers)

<IfModule mod_headers.c>
    Header always set X-Content-Type-Options "nosniff"
    Header always set X-Frame-Options "SAMEORIGIN"
    Header always set X-XSS-Protection "1; mode=block"
    Header always set Referrer-Policy "strict-origin-when-cross-origin"
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
    Header always set Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline';"
</IfModule>

توضیح هر هدر به زبان ساده:

۴. جلوگیری از حملات تزریق کد در Query String (XSS و Injection)

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR]
    RewriteCond %{QUERY_STRING} (;|'|"|\)|\%0A|\%0D|\%22).*(script|onerror|eval|base64_decode) [NC]
    RewriteCond %{QUERY_STRING} (GLOBALS|_REQUEST) [NC]
    RewriteRule ^ - [F,L]
</IfModule>

توضیح: این قوانین درخواست‌هایی که حاوی کد جاوااسکریپت مخرب یا متغیرهای خطرناک هستند را شناسایی و بلاک می‌کنند (مثال: ?<script>alert(1)</script> یا ?GLOBALS[admin]=1).

۵. محدود کردن متدهای HTTP مجاز

<LimitExcept GET POST HEAD>
    Require all denied
</LimitExcept>

توضیح: متدهای خطرناک مانند PUT، DELETE، TRACE، OPTIONS و غیره غیرفعال می‌شوند و فقط GET، POST و HEAD مجاز هستند. این کار جلوی بسیاری از حملات آپلود فایل یا اسکن را می‌گیرد.

۶. اجباری کردن HTTPS (ریدایرکت http به https)

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

توضیح: تمام بازدیدکنندگان با http وارد شوند، به‌صورت دائمی (301) به نسخه https هدایت می‌شوند. این کار امنیت را بالا می‌برد و امتیاز سئوی گوگل را بهبود می‌دهد.

۷. صفحات خطای سفارشی و کاربرپسند

ErrorDocument 400 /errors/400.html
ErrorDocument 401 /errors/401.html
ErrorDocument 403 /errors/403.html
ErrorDocument 404 /errors/404.html
ErrorDocument 500 /errors/500.html

توضیح: به جای صفحه پیش‌فرض زشت و فنی سرور، صفحات HTML زیبا و اطلاع‌رسان خودتان را نمایش دهید. این کار تجربه کاربری را بهتر می‌کند.

۸. بهینه‌سازی کش مرورگر برای فایل‌های استاتیک

<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresByType image/jpeg "access plus 1 month"
    ExpiresByType image/png "access plus 1 month"
    ExpiresByType image/gif "access plus 1 month"
    ExpiresByType text/css "access plus 1 week"
    ExpiresByType application/javascript "access plus 1 week"
</IfModule>

توضیح: مرورگر فایل‌های ثابت (عکس، css، js) را برای مدت طولانی در کش نگه می‌دارد. این کار تعداد درخواست‌ها به سرور را کاهش می‌دهد و سرعت سایت را افزایش می‌دهد.

۹. جلوگیری از Hotlinking تصاویر و فایل‌ها

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?yourdomain\.ir [NC]
RewriteRule \.(jpg|jpeg|png|gif|webp|svg|pdf)$ - [NC,F,L]

توضیح: سایت‌های دیگر نمی‌توانند تصاویر یا فایل‌های شما را مستقیماً در صفحه‌شان نمایش دهند. این کار از دزدی پهنای باند جلوگیری می‌کند.

۱۰. بلاک کردن بات‌های مخرب و اسکنرها

RewriteCond %{HTTP_USER_AGENT} (nikto|sqlmap|havij|scanner|wget|python|libwww-perl|MJ12bot|DotBot) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^$ [NC]
RewriteRule .* - [F,L]

توضیح: بسیاری از ابزارهای هک و اسکن خودکار (مانند Nikto، SQLMap، Havij) و بات‌های خالی (بدون User-Agent) بلاک می‌شوند.

۱۱. ریدایرکت www به non-www یا برعکس

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [L,R=301]

توضیح: بازدید از نسخه www به نسخه بدون www هدایت می‌شود (یا برعکس). این کار از Duplicate Content در سئو جلوگیری می‌کند.

۱۲. فشرده‌سازی Gzip برای فایل‌های متنی

<IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/json
</IfModule>

توضیح: فایل‌های متنی قبل از ارسال به مرورگر فشرده می‌شوند → حجم کمتر → سرعت بارگذاری بالاتر.

۱۳. بلاک کردن IPهای خاص یا رنج IP

<RequireAll>
    Require all granted
    Require not ip 192.168.1.100
    Require not ip 203.0.113.0/24
</RequireAll>

توضیح: IPهای مشخص یا کل یک رنج شبکه بلاک می‌شوند (مفید برای بلاک اسپمرها یا مهاجمان شناخته‌شده).

۱۴. فقط اجازه دسترسی به فایل/پوشه از IPهای خاص

<Files "admin.php">
    Require ip 192.168.1.0/24 127.0.0.1
</Files>

توضیح: فقط از IPهای مجاز (مثلاً شبکه داخلی یا IP شما) اجازه دسترسی به پنل مدیریت یا فایل حساس داده می‌شود.

۱۵. غیرفعال کردن اجرای PHP در پوشه‌های آپلود

<Directory "/var/www/uploads">
    php_flag engine off
</Directory>

توضیح: اگر کسی فایل PHP مخرب در پوشه آپلود بگذارد، اجرا نمی‌شود (امنیت در برابر آپلود شل و وب‌شل).

۱۶. افزایش محدودیت آپلود فایل در PHP

php_value upload_max_filesize 64M
php_value post_max_size 64M
php_value memory_limit 256M
php_value max_execution_time 300

توضیح: محدودیت آپلود را افزایش می‌دهد (فقط در صورتی کار می‌کند که mod_php فعال باشد. بهتر است در php.ini تنظیم شود).

۱۷. ریدایرکت هم‌زمان http به https + www به non-www

RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^ https://example.ir%{REQUEST_URI} [L,R=301]

توضیح: هر دو مشکل رایج (http و www) را در یک قانون واحد حل می‌کند.

۱۸. جلوگیری از اجرای اسکریپت در پوشه‌های خاص

<FilesMatch "\.(php|php[0-9]|phtml|phps|pl|py|jsp|asp|aspx|cgi|sh)$">
    Require all denied
</FilesMatch>

توضیح: در پوشه‌هایی مثل /uploads/ یا /images/ هیچ فایل اجرایی (php، pl، py و ...) اجرا نشود.

۱۹. تنظیم CORS ساده (برای API یا فونت/تصاویر)

Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Methods "GET, POST, OPTIONS"
Header set Access-Control-Allow-Headers "Content-Type, Authorization"

توضیح: اجازه می‌دهد سایت‌های دیگر از منابع شما (مثل API یا فونت) استفاده کنند. با احتیاط استفاده شود (بهتر است دامنه خاص بگذارید نه *).

۲۰. فعال‌سازی احراز هویت Basic (نام کاربری + رمز)

AuthType Basic
AuthName "منطقه محدود"
AuthUserFile /path/to/.htpasswd
Require valid-user

توضیح: پوشه یا فایل را با پنجره ورود نام کاربری و رمز محافظت می‌کند. ابتدا باید فایل .htpasswd با ابزار htpasswd ساخته شود.

ساخت .htpasswd در لینوکس: htpasswd -c /path/to/.htpasswd username
نکات پایانی مهم: