چرا «ساخت فایل .htaccess» مهم است؟
اگر میخواهید پیوندهای یکتا (Permalinks) در وردپرس درست کار کنند، ریدایرکتهای صحیح داشته باشید، امنیت پایه را بالا ببرید یا کش/فشردهسازی را از سطح وبسرور تنظیم کنید، باید ساخت فایل .htaccess را بلد باشید. .htaccess یک فایل پیکربندی توزیعشده برای وبسرور Apache (و سرورهای مشابه مثل Litespeed) است که کنترل دسترسی، بازنویسی آدرسها (mod_rewrite)، و تنظیمات متفاوت سرور را در سطح پوشه ممکن میکند. توجه: Nginx از .htaccess پشتیبانی نمیکند—برای Nginx باید قواعد را در فایل پیکربندی سرور (nginx.conf یا سایتهای موجود) قرار دهید یا معادلسازی کنید.
آمادهسازی: قبل از ساخت فایل .htaccess چه کار کنیم
- بکاپ کامل بگیرید. همیشه قبل از ویرایش فایلهای سیستمی (مثل
.htaccessیاwp-config.php) از روت سایت بکاپ بگیرید (فایل + پایگاه داده). - محیط دسترسی: تصمیم بگیرید از طریق cPanel File Manager، FTP/SFTP یا از طریق داشبورد وردپرس → تنظیمات → پیوندهای یکتا (Permalinks) تغییر را انجام میدهید. اگر دسترسی SSH دارید، میتوانید با ویرایشگرهایی مثل
nanoیاvimهم کار کنید. راه امن برای بازسازی خودکار.htaccessدر وردپرس، ذخیرهٔ مجدد پیوندهای یکتا است. - تشخیص وبسرور: حتماً بفهمید هاست شما Apache/Litespeed است یا Nginx. چون
.htaccessفقط در Apache/Litespeed کار میکند. اگر Nginx دارید، قواعد را باید به فرمت Nginx تبدیل و در پیکربندی سرور قرار دهید.
ایجاد یا بازیابی فایل .htaccess (گامبهگام)
روش A — با cPanel (File Manager)
- وارد cPanel شوید → File Manager → پوشهٔ روت سایت (معمولاً
public_htmlیا پوشهٔ نصب وردپرس). - اگر فایل
.htaccessرا نمیبینید، تنظیمات File Manager را برای نمایش فایلهای مخفی (show hidden files) روشن کنید. - اگر موجود نیست: New File → نام فایل را
.htaccessبگذارید و ذخیره کنید. - روی فایل راستکلیک → Edit → کد مورد نظر را قرار دهید → Save.
روش B — با FTP/SFTP
- با نرمافزار FTP (مثلاً FileZilla) متصل شوید.
- در فولدر روت (
public_html) فایل.htaccessرا آپلود کنید یا همانجا جدید بسازید. - دسترسی فایل معمولاً 644 مناسب است (مالک: خواندن/نوشتن، گروه: خواندن، عمومی: خواندن).
روش C — بازسازی خودکار از وردپرس
- وارد وردپرس شوید → تنظیمات → پیوندهای یکتا → بدون تغییر روی Save Changes کلیک کنید؛ وردپرس تلاش میکند فایل
.htaccessرا بازنویسی کند (نیاز به مجوز نوشتن فایل دارد). این روش امن برای بازگرداندن کد پیشفرض است.
کد پیشفرض وردپرس (قرار دادن بهعنوان پایه)
این بلوک را به عنوان نقطهٔ شروع در فایل قرار دهید. وردپرس معمولاً بین خطهای # BEGIN WordPress و # END WordPress نوشته میشود:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
این کد مسئول راهاندازی پیوندهای یکتا (pretty permalinks) در وردپرس است. اگر این بخش خراب شود، صفحات سایت احتمالاً 404 یا خطای دیگر نشان میدهند. برای مرجع رسمی و بازیابی میتوانید به مستندات وردپرس مراجعه کنید.
ریدایرکت امن: HTTPS و canonical (نمونههای پیشنهادی)
توجه: همیشه
https://را بهجایhttp://توصیه کنید و ترجیحا از ریدایرکت 301 برای SEO استفاده کنید.
الف) ریدایرکت همه به HTTPS + بدون www (نمونهٔ کامل)
# Force HTTPS and non-www
<IfModule mod_rewrite.c>
RewriteEngine On
# If not HTTPS or if www present, redirect to https://example.com
RewriteCond %{HTTPS} !=on [OR]
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [L,R=301]
</IfModule>
این کد هر درخواست را به نسخه HTTPS و بدون www هدایت میکند. قبل از قرار دادن، example.com را با دامنه خود بررسی کنید یا از قالب بالا که نام میزبان را خودکار جایگزین میکند استفاده کنید. (منبع: نمونههای رایج و مباحث فنی درباره forcing https).
ب) ریدایرکت از بدون www به با www (HTTPS)
# Force HTTPS and www
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
نکتهٔ سئو: انتخاب www یا non-www یک تصمیم است؛ مهم این است که روی یک نسخه canonical باقی بمانید و از ریدایرکت 301 استفاده کنید.
قوانین امنیتی حیاتی (نمونهها و توضیح خطبهخط)
در این بخش کدهایی قرار میدهم که بهصورت عملی امنیت سایت را افزایش میدهد. همیشه قبل از اعمال تست و بکاپ بگیرید.
1) جلوگیری از مشاهدهٔ فایلهای سیستمی (.htaccess, wp-config.php)
<FilesMatch "(\.htaccess|wp-config\.php|readme\.html|license\.txt)$">
Order allow,deny
Deny from all
</FilesMatch>
توضیح: جلوگیری از دسترسی مستقیم به فایلهای حساس از طریق مرورگر.
2) محافظت از wp-config.php (روشی دیگر)
<files wp-config.php>
order allow,deny
deny from all
</files>
3) غیرقابلاجرا کردن فایلهای PHP در پوشه uploads
در داخل /wp-content/uploads/.htaccess قرار دهید:
<FilesMatch "\.php$">
deny from all
</FilesMatch>
این جلوی اجرای فایلهای PHP در پوشهٔ آپلودها را میگیرد — یک لایهٔ مهم برای جلوگیری از backdoor های آپلود شده توسط مهاجمین. منابع راهنما و مقالات امنیتی نیز این روش را توصیه میکنند.
4) جلوگیری از فهرستشدن دایرکتوریها
Options -Indexes
5) مسدودسازی بر اساس IP یا User-Agent (نمونه)
<RequireAll>
Require all granted
Require not ip 1.2.3.4
Require expr %{REQUEST_HEADERS}['User-Agent'] !~ /BadBot/i
</RequireAll>
(در آپاچیهای جدید از Require استفاده میشود؛ اگر سرورتان نسخهٔ قدیمیتر است، شکل دیگری از قواعد ممکن است لازم باشد.)
کش و فشردهسازی (نمونههای ساده)
فعالسازی gzip
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/plain text/html text/xml text/css application/javascript application/json
</IfModule>
تنظیم زمان کش مرورگر (expires)
<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 text/css "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
</IfModule>
این قواعد باعث کاهش بار سرور و بهبود سرعت میشوند — بخشی از بهترینروشهای عملکردی برای سئو و UX.
معادل Nginx برای قواعد رایج
یادتان باشد Nginx .htaccess را ارزیابی نمیکند؛ باید قواعد را به فرمت Nginx تبدیل کنید و در بخش server { ... } قرار دهید. مستندات رسمی Nginx راهنما و مثالهایی برای تبدیل ارائه دادهاند. نمونهٔ ساده ریدایرکت به HTTPS + non-www در Nginx:
server {
listen 80;
server_name www.example.com example.com;
return 301 https://example.com$request_uri;
}
برای تبدیل قواعد mod_rewrite پیچیده، بهتر است از مستندات تبدیل یا ابزارهای تبدیل استفاده کنید و بعد تست کنید.
تست، بازگردانی و خطایابی (گامهای عملی)
- قبل از آپلود: کد را در یک ویرایشگر متنی تست کنید؛ یک اشتباه کوچک (مثلاً حذف
#END) میتواند سایت را بههم بزند. - محیط تست: اگر امکان دارد روی محیط لوکال (LocalWP یا XAMPP) یا یک زیر دامنه (staging) تست کنید.
- پشتیبان: قبل از هر تغییر، یک کپی از
.htaccessو فایلهای مهم ذخیره کنید. - لاگها: اگر سایت خطا داد، به لاگهای Apache (error_log) نگاه کنید؛ خطا معمولاً نشان میدهد کدام خط مشکل دارد.
- چک لیست سریع خطایابی:
- آیا
mod_rewriteفعال است؟ - آیا فایل با اجازهٔ نوشتن توسط وبسرور ذخیره شده؟
- پس از اعمال تغییر، حافظهٔ کش (Cache) و CDN را پاک کنید.
- آیا
سناریوهای واقعی و مثال کاربردی (جدول مقایسه)
| نیاز | کد نمونه | تذکر |
|---|---|---|
| بازگردانی پیوندهای یکتا | کد پیشفرض وردپرس | از Save Permalinks استفاده کنید. |
| ریدایرکت به HTTPS و non-www | مثال ریدایرکت 301 بالا | مناسب برای SEO (301). |
| جلوگیری از اجرای PHP در uploads | <FilesMatch "\.php$"> deny from all </FilesMatch> | درون /wp-content/uploads قرار گیرد. |
| فعالسازی gzip | mod_deflate snippet | نیاز به ماژول سرور دارد. |
| معادل برای Nginx | قرار در server{} | .htaccess در Nginx کار نمیکند. |
جمعبندی و بهترین روند کاری (Checklist نهایی)
- تشخیص وبسرور (Apache/Litespeed یا Nginx).
- ساخت/ویرایش
.htaccessدرpublic_htmlیا بازسازی از طریق Permalinks. - قرار دادن کد پیشفرض وردپرس بهعنوان پایه.
- افزودن ریدایرکتهای HTTPS/canonical (با احتیاط).
- اضافه کردن قوانین امنیتی (محافظت wp-config، جلوگیری اجرای PHP در uploads).
- تست در staging و گرفتن بکاپ.
- پاک کردن کش و بررسی لاگ در صورت خطا.