از مبتدی تا پیشرفته – امنیت، ریدایرکت، کش و تنظیمات Apache
فایل متنی مخفی (با نقطه اول در نام) که در پوشههای سایت قرار میگیرد و به سرور Apache دستور میدهد چگونه رفتار کند. این فایل قدرتمندترین ابزار تنظیمات بدون نیاز به دسترسی root است.
کاربردهای اصلی:
.htaccess بگذارید (نقطه اول ضروری است)<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) دریافت میکند.
Options -Indexes
توضیح: وقتی یک پوشه فایل index (مثل index.html یا index.php) نداشته باشد، سرور Apache بهصورت پیشفرض لیست تمام فایلهای داخل آن پوشه را نشان میدهد. این خط آن رفتار را غیرفعال میکند و به جای لیست، خطای 403 نمایش داده میشود.
فایده امنیتی: هکرها دیگر نمیتوانند با وارد کردن آدرس پوشهها (مثل /uploads/ یا /backup/) به دنبال فایلهای حساس بگردند.
<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>
توضیح هر هدر به زبان ساده:
<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).
<LimitExcept GET POST HEAD>
Require all denied
</LimitExcept>
توضیح: متدهای خطرناک مانند PUT، DELETE، TRACE، OPTIONS و غیره غیرفعال میشوند و فقط GET، POST و HEAD مجاز هستند. این کار جلوی بسیاری از حملات آپلود فایل یا اسکن را میگیرد.
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) را برای مدت طولانی در کش نگه میدارد. این کار تعداد درخواستها به سرور را کاهش میدهد و سرعت سایت را افزایش میدهد.
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) بلاک میشوند.
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [L,R=301]
توضیح: بازدید از نسخه www به نسخه بدون www هدایت میشود (یا برعکس). این کار از Duplicate Content در سئو جلوگیری میکند.
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/json
</IfModule>
توضیح: فایلهای متنی قبل از ارسال به مرورگر فشرده میشوند → حجم کمتر → سرعت بارگذاری بالاتر.
<RequireAll>
Require all granted
Require not ip 192.168.1.100
Require not ip 203.0.113.0/24
</RequireAll>
توضیح: IPهای مشخص یا کل یک رنج شبکه بلاک میشوند (مفید برای بلاک اسپمرها یا مهاجمان شناختهشده).
<Files "admin.php">
Require ip 192.168.1.0/24 127.0.0.1
</Files>
توضیح: فقط از IPهای مجاز (مثلاً شبکه داخلی یا IP شما) اجازه دسترسی به پنل مدیریت یا فایل حساس داده میشود.
<Directory "/var/www/uploads">
php_flag engine off
</Directory>
توضیح: اگر کسی فایل 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 تنظیم شود).
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 و ...) اجرا نشود.
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 یا فونت) استفاده کنند. با احتیاط استفاده شود (بهتر است دامنه خاص بگذارید نه *).
AuthType Basic
AuthName "منطقه محدود"
AuthUserFile /path/to/.htpasswd
Require valid-user
توضیح: پوشه یا فایل را با پنجره ورود نام کاربری و رمز محافظت میکند. ابتدا باید فایل .htpasswd با ابزار htpasswd ساخته شود.
htpasswd -c /path/to/.htpasswd username