فایل .htaccess یک فایل پیکربندی کوچک است که قدرت زیادی در آستین دارد. اگر سایت شما روی Apache اجرا میشود و به تنظیمات سرور دسترسی مستقیم ندارید، .htaccess ابزار اصلی شماست: redirect URL ها، بهبود امنیت، بهینهسازی عملکرد، صفحات خطای سفارشی، محدودیت دسترسی — همه اینها با چند خط کد در این فایل کوچک.
در این راهنما همه کاربردهای مهم .htaccess را با مثالهای عملی و آماده برای استفاده بررسی میکنیم. هر مثال را میتوانید مستقیماً در فایل خود کپی و استفاده کنید.
htaccess چیست و چطور کار میکند؟
فایل .htaccess (مخفف HyperText Access) یک فایل پیکربندی Apache است که در هر دایرکتوری میتواند وجود داشته باشد. تنظیمات آن روی همان دایرکتوری و تمام زیردایرکتوریهای آن اعمال میشود. نقطه در ابتدای نام باعث میشود در سیستمهای Unix/Linux مخفی باشد.
مزیت اصلی .htaccess: نیازی به restart وب سرور ندارد و تغییرات فوراً اعمال میشوند. اما یک نکته مهم: Apache در هر درخواست این فایل را میخواند، پس پیکربندی زیاد میتواند سرور را کند کند. اگر به تنظیمات اصلی سرور دسترسی دارید، بهتر است تنظیمات مهم را آنجا قرار دهید.
Redirect با htaccess
یکی از رایجترین و پرکاربردترین کاربردهای .htaccess، هدایت URL ها است.
ریدایرکت ساده ۳۰۱
هدایت دائمی یک صفحه قدیمی به صفحه جدید. کد ۳۰۱ به گوگل میگوید اعتبار SEO صفحه قدیمی را به صفحه جدید منتقل کند:
- Redirect 301 /old-page.html /new-page
هدایت HTTP به HTTPS
یکی از مهمترین تنظیمات امنیتی و SEO. همه ترافیک HTTP را به HTTPS هدایت کنید:
- RewriteEngine On
- RewriteCond %{HTTPS} off
- RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
هدایت www به non-www (و برعکس)
از نظر SEO مهم است که همه لینکها به یک نسخه بروند. برای هدایت به non-www:
- RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
- RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
برای هدایت به www:
- RewriteCond %{HTTP_HOST} !^www\. [NC]
- RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
ریدایرکت کل دامنه
برای انتقال کامل یک سایت به دامنه جدید:
- RewriteEngine On
- RewriteCond %{HTTP_HOST} !^newdomain\.com$ [NC]
- RewriteRule ^(.*)$ https://newdomain.com/$1 [R=301,L]
URL Rewriting: URL های تمیز و زیبا
URL Rewriting یعنی تبدیل URL های نادیدنی (مثل product.php?id=123) به URL های زیبا و خوانا (مثل /products/php-book). این هم برای کاربر بهتر است هم برای موتورهای جستجو.
فعال کردن mod_rewrite
قبل از هر چیز، RewriteEngine را فعال کنید:
- RewriteEngine On
- RewriteBase /
نمونههای عملی
- تبدیل
/product/123بهproduct.php?id=123:
RewriteRule ^product/([0-9]+)/?$ product.php?id=$1 [L,QSA] - تبدیل
/blog/post-titleبهblog.php?slug=post-title:
RewriteRule ^blog/([a-zA-Z0-9-]+)/?$ blog.php?slug=$1 [L,QSA]
htaccess در لاراول
لاراول برای کار صحیح به .htaccess نیاز دارد. فایل پیشفرض لاراول در پوشه public قرار دارد و همه درخواستها را به index.php هدایت میکند. اگر URL های لاراول کار نمیکنند:
- mod_rewrite فعال است؟ apache2ctl -M | grep rewrite
- AllowOverride روی All تنظیم شده؟ در پیکربندی vhost چک کنید
- Document Root روی پوشه public تنظیم شده؟
htaccess در وردپرس
وردپرس برای Permalink ها به .htaccess نیاز دارد. وردپرس این فایل را در Settings > Permalinks به صورت خودکار میسازد. اگر Permalink ها کار نمیکنند، Settings > Permalinks را ذخیره کنید تا .htaccess بازنویسی شود. اگر مشکل ادامه داشت، AllowOverride را چک کنید.
امنیت با htaccess
.htaccess ابزار قدرتمندی برای افزایش امنیت سایت است — و بدون نیاز به دسترسی root.
جلوگیری از دسترسی به فایلهای حساس
فایلهایی مثل .env، wp-config.php، error_log و فایلهای پیکربندی نباید از مرورگر قابل دسترسی باشند:
- <FilesMatch "\.(env|ini|log|sh|htpasswd|bak|sql)$">
- Require all denied
- </FilesMatch>
بلاک کردن IP های مزاحم
IP های مخرب یا باتهای مزاحم را بلاک کنید (دستورات Apache 2.4):
- <RequireAll>
- Require all granted
- Require not ip 192.168.1.100
- Require not ip 10.0.0.0/8
- </RequireAll>
محافظت با رمز (HTTP Authentication)
برای محدود کردن دسترسی به یک دایرکتوری (مثلاً برای محیط staging):
- AuthType Basic
- AuthName "Protected Area"
- AuthUserFile /path/to/.htpasswd
- Require valid-user
فایل .htpasswd با دستور htpasswd -c /path/.htpasswd username ساخته میشود.
جلوگیری از Directory Listing
اگر index.html یا index.php در پوشهای نباشد، Apache لیست فایلها را نشان میدهد. این یک مشکل امنیتی است. برای جلوگیری:
- Options -Indexes
جلوگیری از Hotlinking
Hotlinking یعنی سایت دیگری مستقیماً از URL تصاویر سایت شما استفاده کند. این پهنای باند شما را میخورد بدون اینکه ترافیک شما باشد:
- RewriteCond %{HTTP_REFERER} !^$
- RewriteCond %{HTTP_REFERER} !^https://(www\.)?yoursite\.com/ [NC]
- RewriteRule \.(jpg|jpeg|png|gif|webp|svg)$ - [F,NC]
محدود کردن اجرای اسکریپت در پوشه uploads
برای جلوگیری از اجرای فایلهای PHP در پوشه uploads (یکی از راههای جلوگیری از webshell):
- <FilesMatch "\.(php|php3|php4|php5|phtml|pl|cgi|sh)$">
- Require all denied
- </FilesMatch>
بهینهسازی عملکرد
کش مرورگر (Browser Caching)
با expire headers، به مرورگر میگویید فایلهای استاتیک را cache کند تا در بازدیدهای بعدی نیاز به دانلود مجدد نباشد. این یکی از سادهترین راههای بهبود سرعت سایت است:
- <IfModule mod_expires.c>
- ExpiresActive On
- ExpiresByType image/jpeg "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 application/x-font-woff2 "access plus 1 year"
- </IfModule>
فشردهسازی Gzip
فشردهسازی فایلهای متنی قبل از ارسال به مرورگر میتواند حجم را تا ۷۰٪ کاهش دهد. برای صفحهای که ۱۰۰ کیلوبایت HTML دارد، با Gzip ممکن است ۳۰ کیلوبایت ارسال شود:
- <IfModule mod_deflate.c>
- AddOutputFilterByType DEFLATE text/html text/plain text/css
- AddOutputFilterByType DEFLATE application/javascript application/json
- AddOutputFilterByType DEFLATE image/svg+xml application/xml
- </IfModule>
Cache-Control Headers
کنترل دقیقتر cache با header های HTTP. برای فایلهایی که version در نامشان دارند (content hashing):
- <FilesMatch "\.(js|css|png|jpg|gif|ico|woff2)$">
- Header set Cache-Control "max-age=31536000, public, immutable"
- </FilesMatch>
Security Headers
Header های امنیتی HTTP به مرورگر میگویند چطور محتوا را پردازش کند. این header ها از حملات رایج جلوگیری میکنند:
- X-Frame-Options DENY: جلوگیری از clickjacking — سایت شما در iframe نمایش داده نمیشود
- X-Content-Type-Options nosniff: جلوگیری از MIME sniffing — مرورگر نوع فایل را به روش خودش تشخیص نمیدهد
- X-XSS-Protection "1; mode=block": فعال کردن XSS filter مرورگر
- Strict-Transport-Security "max-age=31536000; includeSubDomains": اجبار HTTPS برای ۱ سال
- Referrer-Policy "strict-origin-when-cross-origin": کنترل اطلاعاتی که هنگام کلیک روی لینکها ارسال میشود
برای اضافه کردن header ها از این syntax استفاده کنید: Header always set X-Frame-Options "DENY"
تنظیمات PHP با htaccess
اگر به php.ini دسترسی ندارید، میتوانید بسیاری از تنظیمات PHP را از .htaccess تغییر دهید — این برای هاستهای اشتراکی خیلی مفید است:
- افزایش memory limit: php_value memory_limit 256M
- افزایش حداکثر حجم آپلود: php_value upload_max_filesize 64M
- افزایش post size: php_value post_max_size 64M
- افزایش execution time: php_value max_execution_time 300
- غیرفعال کردن display errors: php_flag display_errors off
- تنظیم timezone: php_value date.timezone "Asia/Tehran"
صفحات خطای سفارشی
به جای صفحات خطای پیشفرض Apache که ظاهر نازیبایی دارند، صفحات خودتان را نشان دهید:
- ErrorDocument 400 /errors/400.html
- ErrorDocument 403 /errors/403.html
- ErrorDocument 404 /errors/404.html
- ErrorDocument 500 /errors/500.html
- ErrorDocument 503 /errors/503.html
نکات مهم و هشدارها
همیشه بکاپ بگیرید
یک اشتباه کوچک در .htaccess میتواند سایت را کاملاً از دسترس خارج کند. قبل از هر تغییر، نسخه فعلی را ذخیره کنید. این یک قانون بدون استثنا است.
دستورات Apache 2.4 را استفاده کنید
Apache 2.4 دستورات جدیدی برای access control دارد. به جای Order Allow,Deny و Allow from all (که متعلق به Apache 2.2 است)، از Require all granted و Require all denied استفاده کنید.
htaccess فقط برای Apache است
اگر از Nginx استفاده میکنید، .htaccess کار نمیکند. Nginx تنظیمات را در فایلهای پیکربندی جداگانه (/etc/nginx/sites-available/) دارد. برخی کنترلپنلها مثل Plesk میتوانند .htaccess را به تنظیمات Nginx تبدیل کنند.
mod_rewrite باید فعال باشد
برای URL rewriting، ماژول mod_rewrite باید فعال باشد و AllowOverride باید روی All یا حداقل FileInfo تنظیم شده باشد. برای چک:
- apache2ctl -M | grep rewrite
سوالات متداول
چطور بفهمم .htaccess اعمال شده؟
بعد از ذخیره .htaccess، سایت را در مرورگر باز کنید. اگر خطای ۵۰۰ داشتید، احتمالاً syntax اشتباه دارد. error log وب سرور را چک کنید — دقیقاً نوشته کدام خط اشتباه است. با دستور curl -I http://yoursite.com/old-url میتوانید header های redirect را ببینید و بررسی کنید redirect اعمال شده یا نه.
چرا redirect من کار نمیکند؟
چند دلیل رایج: RewriteEngine On را فراموش کردهاید. mod_rewrite فعال نیست. AllowOverride روی None تنظیم شده. قوانین Rewrite درست نوشته نشدهاند. ترتیب قوانین اشتباه است — قوانین از بالا به پایین اجرا میشوند. اگر caching فعال است، ممکن است redirect قدیمی در cache باشد — با مرورگر Private/Incognito تست کنید.
آیا .htaccess روی سرعت سایت تأثیر دارد؟
بله، اما معمولاً جزئی. Apache در هر درخواست .htaccess فایلها را از ریشه تا دایرکتوری فعلی میخواند. در سرورهایی با SSD این تأثیر ناچیز است. اما اگر قوانین rewrite زیاد و پیچیده دارید، ممکن است محسوس شود. برای عملکرد بهتر در production، تنظیمات را در فایلهای پیکربندی اصلی Apache قرار دهید و AllowOverride را None کنید.
چطور .htaccess را در لاراول تنظیم کنم؟
لاراول یک .htaccess پیشفرض در پوشه public دارد که همه درخواستها را به index.php هدایت میکند. معمولاً نیاز به تغییر آن نیست. اگر URL ها کار نمیکنند، این سه چیز را چک کنید: Document Root روی پوشه public، mod_rewrite فعال، و AllowOverride All در پیکربندی vhost. اگر همه اینها درست بود و باز هم کار نمیکرد، کش Apache را با apachectl -k graceful flush کنید.
جمعبندی
فایل .htaccess یک ابزار چندمنظوره است که با کمترین دسترسی، بیشترین کنترل را روی رفتار سایت میدهد: redirect، URL rewriting، امنیت، بهینهسازی، کنترل دسترسی و تنظیمات PHP — همه در یک فایل متنی ساده.
مهمترین نکات: قبل از هر تغییر بکاپ بگیرید. از دستورات Apache 2.4 استفاده کنید. RewriteEngine On را فراموش نکنید. و اگر به پیکربندی اصلی سرور دسترسی دارید، تنظیمات مهم را آنجا بگذارید تا performance بهتر باشد. با تسلط بر .htaccess، بسیاری از نیازهای فنی سایت را بدون نیاز به دسترسی root سرور برآورده میکنید.