htaccess فایل تنظیم وب‌سرور برای یک پوشه است: هر قانونی در آن بنویسید، برای همان پوشه و زیرپوشه‌هایش اعمال می‌شود، بدون نیاز به دسترسی سرور. دو قاعده را همیشه رعایت کنید: قبل از هر تغییر از فایل کپی بگیرید، و بعد از هر تغییر سایت را تست کنید. یک نویسه‌ی اشتباه کل سایت را با خطای ۵۰۰ پایین می‌آورد. روی هاست رایکت وب‌سرور لایت‌اسپید است که همین قانون‌ها را می‌خواند.

فایل کجاست؟

در پوشه‌ی سایت (معمولاً public_html)، با نام .htaccess. چون با نقطه شروع می‌شود مخفی است؛ در File Manager از Settings تیک Show Hidden Files را بزنید. اگر وجود ندارد، با همین نام بسازیدش. (نمایش فایل‌های مخفی)

ترتیب مهم است

قانون‌ها از بالا به پایین خوانده می‌شوند. ریدایرکت‌های کلی (HTTPS و www) را بالای فایل بگذارید و بلوک وردپرس را (بین # BEGIN WordPress و # END WordPress) دست نزنید؛ قانون‌های خودتان را بیرون از آن بنویسید، چون وردپرس آن بخش را بازنویسی می‌کند.

۱. اجبار HTTPS

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

خط دوم می‌گوید اگر اتصال رمزگذاری‌شده نیست. خط سوم برای وقتی است که سایت پشت کلودفلر یا پراکسی است؛ بدون آن، حلقه‌ی ریدایرکت ساخته می‌شود. ساده‌تر از این قانون، کلید Force HTTPS Redirect در بخش Domains سی‌پنل است؛ فقط یکی از این دو را فعال کنید. (Too many redirects)

۲. یکی کردن www

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

هر آدرس با www را به همان آدرس بدون www می‌فرستد. (www یا بدون www)

۳. ریدایرکت یک صفحه

Redirect 301 /old-page/ https://example.com/new-page/

برای وقتی که آدرس یک صفحه عوض شده. مسیر اول نسبی و مقصد کامل است.

۴. ریدایرکت کل دامنه

RewriteCond %{HTTP_HOST} ^(www\.)?old-domain\.com$ [NC]
RewriteRule ^(.*)$ https://new-domain.ir/$1 [R=301,L]

هر صفحه را به همان مسیر روی دامنه‌ی جدید می‌فرستد. (تغییر دامنه بدون افت سئو)

۵. بستن فهرست فایل‌ها

Options -Indexes

اگر پوشه‌ای فایل index نداشته باشد، به‌جای فهرست فایل‌ها خطای ۴۰۳ می‌دهد.

۶. بستن فایل‌های حساس

<FilesMatch "^(wp-config\.php|\.env|\.htaccess|error_log|.*\.(sql|bak|log|ini))$">
    Require all denied
</FilesMatch>

دسترسی وب به فایل تنظیمات، بکاپ دیتابیس و لاگ را می‌بندد. سایت خودش هنوز آن‌ها را می‌خواند؛ فقط از مرورگر باز نمی‌شوند.

۷. جلوگیری از اجرای PHP در پوشه‌ی آپلود

این قانون را در یک htaccess جدا، داخل پوشه‌ی wp-content/uploads بگذارید:

<FilesMatch "\.(php|phtml|phar)$">
    Require all denied
</FilesMatch>

اگر مهاجمی از راه فرم آپلود فایل مخرب بگذارد، اجرا نمی‌شود. یکی از مؤثرترین قانون‌های امنیتی وردپرس است.

۸. کش مرورگر

<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresByType image/webp "access plus 1 year"
    ExpiresByType image/jpeg "access plus 1 year"
    ExpiresByType image/png "access plus 1 year"
    ExpiresByType text/css "access plus 1 month"
    ExpiresByType application/javascript "access plus 1 month"
    ExpiresByType font/woff2 "access plus 1 year"
</IfModule>

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

۹. مسدود کردن یک ربات

RewriteCond %{HTTP_USER_AGENT} (BadBot|AnotherBot) [NC]
RewriteRule .* - [F,L]

نام ربات را از لاگ دسترسی بردارید. (لاگ دسترسی)

۱۰. محدود کردن صفحه‌ی ورود به آی‌پی خودتان

<Files "wp-login.php">
    Require ip 203.0.113.7
</Files>

فقط وقتی که آی‌پی ثابت دارید. با آی‌پی متغیر خودتان را بیرون می‌اندازید؛ در آن حالت رمز پوشه یا افزونه‌ی محدودکننده‌ی تلاش ورود بهتر است. (رمز پوشه)

دو قانون کوچک دیگر

کار قانون
صفحه‌ی خطای اختصاصی ErrorDocument 404 /404.html (Error Pages)
تغییر فایل پیش‌فرض پوشه DirectoryIndex index.php index.html

خطا داد؛ چه کنم؟

  1. فایل را به نسخه‌ی کپی قبلی برگردانید.
  2. اگر کپی ندارید، آخرین بلوکی را که اضافه کردید حذف کنید.
  3. لاگ خطا را ببینید؛ شماره‌ی خط و دلیل را می‌گوید. (لاگ خطا)
نشانه علت معمول
خطای ۵۰۰ بلافاصله بعد از ذخیره غلط املایی، تگ بسته‌نشده، یا دستوری که سرور پشتیبانی نمی‌کند
Too many redirects دو قانون ریدایرکت متضاد
قانون اثر ندارد بالاتر از آن قانونی با [L] اجرا شده، یا کش مرورگر
فقط صفحه‌ی اصلی کار می‌کند بلوک وردپرس پاک شده؛ پیوندهای یکتا را ذخیره کنید

سوال‌های رایج

هر پوشه htaccess جدا می‌خواهد؟

نه. فایل پوشه‌ی بالاتر روی زیرپوشه‌ها هم اثر دارد. فایل جدا فقط وقتی لازم است که بخواهید رفتار یک پوشه متفاوت باشد.

سی‌پنل هم در این فایل می‌نویسد؟

بله. تنظیمات PHP، ریدایرکت‌ها، هات‌لینک و آی‌پی‌های مسدود همه بلوک‌هایی در همین فایل‌اند. بلوک‌هایی که بالایشان نوشته خودکار ساخته شده را دستی تغییر ندهید. (ریدایرکت در سی‌پنل)

تعداد زیاد قانون سایت را کند می‌کند؟

چند ده خط اثری ندارد. هزاران خط ریدایرکت یا فهرست بلند آی‌پی، بله.