CDN برای وردپرس در ایران؛ تنظیم کش، پیشخوان و SSL کامل
راهنمای عملی تنظیم CDN برای وردپرس: جدا کردن مسیرهای ایستا و پویا، قانونهای دورزدن کش برای پیشخوان، ووکامرس و کاربران واردشده، و رفتن به حالت SSL کامل با فرمانهای WP-CLI. هزینهی دانلود و سرور آزمایشی هم با نرخهای پنل حساب شده است.

وردپرس را میشود در چند دقیقه پشت یک CDN برد، اما تنظیم پیشفرض برای سایتی که پیشخوان، دیدگاه و سبد خرید دارد کافی نیست. CDN برای وردپرس وقتی درست کار میکند که بدانید کدام درخواست از لبه سرو شود و کدام مستقیم به مبدأ برسد، SSL روی حالت کامل باشد و افزونهها با کش لبه ناسازگاری نکنند. این راهنما همین سه کار را با مسیرها، کوکیها و فرمانهای مشخص پیش میبرد. اگر هنوز دامنه را به CDN نیاوردهاید، نخست راه اندازی CDN ایران گامبهگام را دنبال کنید و بعد به اینجا برگردید.
CDN برای وردپرس: مرز درخواستهای ایستا و پویا
فرض این راهنما این است که وردپرس روی یک سرور لینوکسی، مثلاً یک سرور ساعتی ایران با اوبونتو یا دبیان، اجرا میشود و دامنه با ابر روشن پشت CDN ایران با نودهای لبه در تهران، مشهد و کرمانشاه قرار دارد. در این حالت همهی درخواستها از لبه میگذرند و تصمیم اصلی شما این است که لبه کدام پاسخ را نگه دارد.
پروندههای ایستا؛ کش طولانی بیدردسر
هرچه زیر wp-content/uploads، wp-content/themes، wp-content/plugins و wp-includes است (تصویر، CSS، JS، فونت) برای همهی بازدیدکنندهها یکسان است و میتواند مدت طولانی در لبه بماند. وردپرس به نشانی CSS و JS رشتهی ?ver= میافزاید و با بهروزرسانی قالب یا افزونه همین عدد عوض میشود. پس کلید کش باید رشتهی پرسوجو را در نظر بگیرد؛ وگرنه پس از بهروزرسانی، لبه همان نسخهی قدیمی را تحویل میدهد.
HTML؛ پویا حتی وقتی ایستا به نظر میرسد
یک نشانی واحد در وردپرس میتواند چند HTML متفاوت داشته باشد: مدیر واردشده نوار ابزار بالای صفحه را میبیند، کسی که دیدگاهش در صف بررسی است متن خودش را میبیند، نوشتهی رمزدار پس از وارد کردن رمز باز میشود و در ووکامرس سبد خرید هر کاربر جداست. اگر لبه یکی از این نسخهها را کش کند، به همه نشانش میدهد. دو راه درست دارید:
- HTML را در لبه کش نکنید و کش صفحه را به افزونهی کش روی مبدأ بسپارید که کاربر واردشده را میشناسد. سادهترین و کمخطرترین راه همین است.
- HTML را با مدت کوتاه کش کنید تنها اگر قانونهای مسیر بتوانند بر پایهی کوکی، درخواست را از کش بیرون ببرند.
جدول زیر رفتار پیشنهادی برای هر مسیر است:
| مسیر | محتوا | رفتار پیشنهادی در لبه |
|---|---|---|
/wp-content/uploads/* | تصویر و رسانه | کش طولانی |
/wp-content/themes/*، /wp-content/plugins/*، /wp-includes/* | CSS، JS، فونت | کش طولانی، رشتهی پرسوجو در کلید کش |
/wp-admin/* | پیشخوان و admin-ajax.php | دورزدن کش |
/wp-login.php | ورود | دورزدن کش و محدودسازی با دیوار آتش وب |
/wp-json/* | REST API | دورزدن کش |
?s= و ?preview=true | جستوجو و پیشنمایش | دورزدن کش |
| سبد، تسویه، حساب کاربری ووکامرس | صفحههای شخصی | دورزدن کش |
/xmlrpc.php | XML-RPC | مسدود، اگر اپلیکیشن یا سرویسی به آن نیاز ندارد |
| نوشتهها و برگهها | HTML | کش نشود، یا کش کوتاه با دورزدن بر پایهی کوکی |
نامک صفحههای سبد و تسویه در ووکامرس قابل تغییر است؛ پیش از نوشتن قانون، نشانی واقعی آنها را از تنظیمات ووکامرس بردارید.
دورزدن کش برای پیشخوان و کاربران واردشده
گامبهگام در قوانین مسیر
- برای
/wp-admin/*قانون دورزدن کش بسازید. دقت کنیدadmin-ajax.phpدر همین مسیر است و بسیاری از فرمها و افزونهها برای بازدیدکنندهی عادی هم از آن استفاده میکنند؛ این مسیر باید از کش بیرون باشد، نه مسدود. - همین قانون را برای
/wp-login.phpو/wp-json/*تکرار کنید. - صفحههای سبد، تسویه و حساب کاربری ووکامرس را با نامک واقعیشان اضافه کنید.
- اگر قانونها شرط کوکی را میپذیرند، درخواستهایی را که یکی از این پیشوندها را دارند از کش بیرون ببرید:
wordpress_logged_in_،wp-postpass_،comment_author_،woocommerce_items_in_cartوwp_woocommerce_session_. اگر چنین شرطی در دسترس نیست، HTML را اصلاً در لبه کش نکنید. - قانونهای خاص را بالاتر از قانونهای کلی کش بگذارید تا قانون کلی پیش از آنها اعمال نشود.
- برای
/wp-login.phpدر دیوار آتش وب محدودیت بگذارید تا تلاشهای پیاپی ورود پیش از رسیدن به PHP گرفته شود.
آزمون پس از اعمال قانونها
وردپرس برای پیشخوان و صفحهی ورود خودش سرآیند ضدکش میفرستد. با curl ببینید این سرآیند دستنخورده به کاربر میرسد:
curl -sI https://example.com/wp-login.php | grep -i cache-control
curl -sI 'https://example.com/wp-content/themes/mytheme/style.css?ver=1.2' | grep -i cache-controlخروجی نخست باید شامل no-cache باشد و دومی مدت کش طولانی نشان دهد. آزمون انسانی هم لازم است: در یک مرورگر وارد پیشخوان شوید و چند صفحهی سایت را باز کنید، سپس همان صفحهها را در پنجرهی ناشناس یا مرورگری دیگر ببینید. اگر نوار ابزار مدیر یا نام کاربری در پنجرهی ناشناس پیدا شد، HTML شخصی کش شده است. دربارهی سرآیندهای کش و اثرشان بر شاخصهای سرعت، CDN و سئو: اثر واقعی روی TTFB، LCP و Core Web Vitals را ببینید.
حالت SSL کامل برای وردپرس پشت CDN
تفاوت سه حالت SSL و روند جابهجایی میان آنها در راهنمای SSL رایگان با CDN و حالتهای انعطافپذیر، کامل و سختگیرانه آمده است. نکتهی ویژهی وردپرس این است: در حالت انعطافپذیر، درخواست با HTTP به مبدأ میرسد و تابع is_ssl() وردپرس آن را ناامن میبیند. اگر نشانی سایت در تنظیمات با https ذخیره شده یا ورود امن به پیشخوان اجباری باشد، وردپرس دوباره به https هدایت میکند و پیشخوان در حلقه میافتد. در حالت کامل، لبه با HTTPS به مبدأ وصل میشود و وردپرس بدون ترفند، درخواست را امن میشناسد.
روند پیشنهادی برای وردپرس:
- روی سرور مبدأ گواهی نصب کنید و مطمئن شوید وبسرور روی درگاه ۴۴۳ پاسخ میدهد. برای حالت سختگیرانه گواهی باید معتبر و همنام دامنه باشد.
- حالت SSL دامنه را در پنل CDN روی کامل بگذارید و پس از اطمینان از اعتبار گواهی، سختگیرانه را بسنجید.
- از پایگاه داده پشتیبان بگیرید و نشانی ذخیرهشده را ببینید:
wp db export backup.sql
wp option get home
wp option get siteurl- نشانیهای http را در محتوا جایگزین کنید؛ نخست با
--dry-runتعداد تغییرها را ببینید:
wp search-replace 'http://example.com' 'https://example.com' --all-tables --dry-run
wp search-replace 'http://example.com' 'https://example.com' --all-tables
wp cache flush- در
wp-config.phpورود امن به پیشخوان را اجباری کنید:define( 'FORCE_SSL_ADMIN', true );. این خط تنها در حالت کامل یا سختگیرانه بیخطر است.
افزونهها کنار CDN؛ چه بماند و چه برود
- افزونهی کش صفحه روی مبدأ (مانند WP Super Cache یا W3 Total Cache) را نگه دارید؛ بار PHP و پایگاه داده را کم میکند و کاربر واردشده را درست تشخیص میدهد. فقط مراقب باشید برای HTML سرآیند کش طولانی نفرستد، چون لبه آن را جدی میگیرد.
- افزونههای بازنویسی نشانی به CDN وقتی کل دامنه پشت ابر است لازم نیستند؛ پروندهها همین حالا از لبه میآیند. تعریف یک زیردامنهی جدا تنها پیچیدگی و یک رکورد DNS دیگر میافزاید.
- افزونههای اجباریکنندهی HTTPS که هنگام بارگذاری صفحه نشانیها را بازنویسی میکنند، پس از اصلاح پایگاه داده با WP-CLI معمولاً زائدند و میتوانند با هدایت لبه تداخل کنند.
- افزونههای امنیتی آیپی را برای قفل کردن تلاشهای ورود میخوانند. پشت CDN ممکن است آیپی لبه را به جای کاربر ببینند و با چند خطای ورود، آیپی لبه را قفل کنند. تنظیم خواندن آیپی واقعی را در افزونه بررسی کنید و محدودسازی ورود را به دیوار آتش وب در لبه بسپارید.
- افزونههای بهینهسازی تصویر مستقیم روی هزینه اثر دارند، چون CDN بهازای دانلود حساب میشود.
هزینهی وردپرس پشت CDN با نرخهای پنل
نرخها به تاریخ آبان ۱۴۰۵ است و بهای روز را ماشینحساب صفحهی سفارش نشان میدهد.
| مورد | نرخ |
|---|---|
| دانلود از CDN | ۱٬۲۰۰ تومان هر گیگابایت |
| آپلود به CDN | رایگان |
| ترافیک دانلود سرور ابری ساعتی | ۱٬۰۰۰ تومان هر گیگابایت |
| طرح اقتصادی ۲ (۲ هسته، ۲ گیگابایت رم، ۱۵ گیگابایت دیسک) | ۱٬۶۴۴ تومان در ساعت؛ ۱٬۲۰۰٬۰۰۰ تومان ماهانه |
| طرح حرفهای ۱ (۴ هسته، ۴ گیگابایت رم، ۲۵ گیگابایت دیسک) | ۲٬۸۷۷ تومان در ساعت؛ ۲٬۱۰۰٬۰۰۰ تومان ماهانه |
مثال ۱، وبلاگ پرتصویر: اگر دانلود ماهانه از لبه ۲۰۰ گیگابایت باشد: «۲۰۰ گیگابایت × ۱٬۲۰۰ تومان = ۲۴۰٬۰۰۰ تومان». اگر با فشردهسازی تصویرها و بارگذاری تنبل این حجم به ۱۲۰ گیگابایت برسد: «۱۲۰ گیگابایت × ۱٬۲۰۰ تومان = ۱۴۴٬۰۰۰ تومان»؛ یعنی ۹۶٬۰۰۰ تومان کمتر در ماه. بارگذاری رسانه از پیشخوان آپلود به شمار میآید و در صورتحساب CDN نمیآید.
مثال ۲، نسخهی آزمایشی برای سنجش قانونها: پیش از اعمال قانونهای کش روی سایت اصلی، یک کپی روی طرح اقتصادی ۲ بسازید و دو روز آزمون کنید: «۴۸ ساعت × ۱٬۶۴۴ تومان = ۷۸٬۹۱۲ تومان» بهعلاوهی ترافیک دانلود آن. اگر ووکامرس سنگین دارید و آزمون سهروزه روی طرح حرفهای ۱ لازم است: «۷۲ ساعت × ۲٬۸۷۷ تومان = ۲۰۷٬۱۴۴ تومان». پس از آزمون سرور را حذف کنید؛ خاموش کردن هزینهی ساعتی را متوقف نمیکند چون منابع برای سرور نگه داشته میشود. ساعت ناقص هم کسر نمیشود و به دور بعد میرود.
اشتباههای رایج
کش کردن HTML بدون استثنای کوکی ورود
نتیجهاش دیده شدن نوار مدیر یا سبد خرید یک نفر برای دیگران است. راه پرهیز: یا HTML را در لبه کش نکنید، یا تنها وقتی کش کنید که قانون دورزدن بر پایهی کوکیهای wordpress_logged_in_ و کوکیهای ووکامرس فعال باشد، و آزمون پنجرهی ناشناس را پس از هر تغییر تکرار کنید.
حذف رشتهی پرسوجو از کلید کش
پس از بهروزرسانی قالب، CSS تازه با ?ver= جدید درخواست میشود ولی لبه نسخهی قبلی را میدهد و ظاهر سایت به هم میریزد. راه پرهیز: برای مسیرهای قالب، افزونه و wp-includes رشتهی پرسوجو را در کلید کش نگه دارید.
اجباری کردن HTTPS پیشخوان در حالت انعطافپذیر
افزودن FORCE_SSL_ADMIN یا ذخیرهی نشانی https وقتی لبه با HTTP به مبدأ وصل میشود، پیشخوان را در حلقهی هدایت میاندازد. راه پرهیز: اول گواهی مبدأ و حالت کامل، بعد تغییر تنظیمات وردپرس.
پرسشهای متداول
ووکامرس پشت CDN به تنظیم جداگانه نیاز دارد؟
بله. صفحههای سبد، تسویه و حساب کاربری و هر درخواستی با کوکی جلسهی ووکامرس باید از کش بیرون بماند. پروندههای ایستای فروشگاه مثل تصویر محصول را میتوان مانند بقیهی سایت کش کرد.
پس از انتشار نوشتهی تازه، چرا صفحهی اصلی هنوز نسخهی قبلی را نشان میدهد؟
چون HTML صفحهی اصلی در لبه یا در افزونهی کش مبدأ تا پایان مدت کش میماند. برای HTML مدت کوتاه بگذارید یا آن را در لبه کش نکنید و پاکسازی را به افزونهی کش مبدأ بسپارید.
باید نشانی پروندهها را به زیردامنهای مثل cdn.example.com ببرم؟
وقتی کل دامنه پشت ابر است نیازی نیست؛ پروندهها از همان دامنه و از لبه سرو میشوند. زیردامنهی جدا تنها وقتی معنا دارد که بخواهید فقط پروندهها و نه HTML از CDN بگذرند.
بارگذاری تصویر از پیشخوان وردپرس در صورتحساب CDN میآید؟
خیر. بارگذاری، آپلود به شمار میآید و در CDN رایگان است؛ تنها دانلود، یعنی دیده شدن آن تصویر به دست بازدیدکنندهها، حساب میشود.
جمعبندی
برای راهاندازی درست CDN برای وردپرس سه کار کافی است: پروندههای ایستا را با رشتهی پرسوجو در کلید کش طولانی کنید، پیشخوان، ورود، REST API و صفحههای شخصی را از کش بیرون ببرید، و پیش از هر تغییر در تنظیمات HTTPS وردپرس، مبدأ را به حالت SSL کامل برسانید. بعد افزونههای زائد را بردارید و با آزمون پنجرهی ناشناس مطمئن شوید چیزی شخصی کش نشده است. اگر میخواهید این قانونها را اول روی یک نسخهی آزمایشی بسنجید، میتوانید سرور ساعتی و CDN را کنار هم در ابر ویرا راه بیندازید و پس از آزمون، سرور آزمایشی را حذف کنید.



