رفتن به محتوای اصلی
امنیت و عملکرد وبسایت

غیرفعال‌سازی کش در htaccess؛ راهنمای رفع مشکل نمایش تغییرات

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

محمد عسکری10 دقیقه مطالعه
غیرفعال‌سازی کش در htaccess؛ راهنمای رفع مشکل نمایش تغییرات

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

برای رفع درست مشکل، باید مشخص کنید چه چیزی به‌روز نمی‌شود: محتوای صفحه، فایل CSS، کد JavaScript یا تصویر. سپس کش همان بخش را کنترل کنید؛ نه اینکه بدون بررسی، کش کل سایت را برای همیشه خاموش نگه دارید.

چرا تغییرات سایت نمایش داده نمی‌شوند؟

کش یک نسخه ذخیره‌شده از صفحه یا فایل است که دریافت دوباره آن را سریع‌تر می‌کند. مشکل زمانی رخ می‌دهد که پس از ویرایش، همان نسخه قدیمی همچنان استفاده شود.

چند لایه متفاوت ممکن است در این وضعیت نقش داشته باشند:

لایه کشچه چیزی ذخیره می‌کند؟روش معمول بررسی
مرورگرفایل‌ها و گاهی پاسخ صفحاتابزار توسعه مرورگر و آزمایش با کش غیرفعال
افزونه کش وردپرسنسخه آماده صفحاتپاک‌سازی کش از تنظیمات افزونه
وب‌سرور یا هاستپاسخ‌های تولیدشده سایتبررسی پنل هاست یا درخواست از پشتیبانی
CDNمحتوا در سرورهای واسطپاک‌سازی کش و بررسی قوانین CDN
Service Workerمنابع سایت برای استفاده مجدد یا آفلاینبررسی بخش Application مرورگر

فایل .htaccess عمدتاً روی رفتار وب‌سرور Apache و هدرهای پاسخ اثر می‌گذارد. این فایل ابزار عمومی پاک‌سازی تمام لایه‌های کش نیست. ممکن است هدرهای کش را اصلاح کنید، ولی افزونه یا CDN همچنان محتوای قدیمی را تحویل دهد.

قبل از غیرفعال‌سازی کش در htaccess چه چیزهایی را بررسی کنیم؟

ابتدا صفحه را با بارگذاری مجدد اجباری باز کنید. در بسیاری از مرورگرهای دسکتاپ، میان‌بر Ctrl + Shift + R این کار را انجام می‌دهد؛ البته رفتار دقیق به مرورگر و سیستم‌عامل بستگی دارد.

برای بررسی دقیق‌تر، ابزار توسعه مرورگر را باز کنید، به بخش Network بروید و گزینه Disable cache را فعال کنید. این گزینه معمولاً فقط تا زمانی مؤثر است که ابزار توسعه باز باشد.

سپس این موارد را بررسی کنید:

  • آیا تغییر در مرورگر دیگری دیده می‌شود؟
  • آیا فایل ویرایش‌شده واقعاً روی هاست بارگذاری شده است؟
  • آیا صفحه، فایل CSS یا JavaScript دیگری را فراخوانی می‌کند؟
  • آیا افزونه بهینه‌سازی، نسخه ترکیب‌شده یا فشرده‌شده قدیمی را ارائه می‌دهد؟
  • آیا سایت پشت CDN قرار دارد؟
  • آیا Service Worker فعال است؟

اگر با غیرفعال کردن کش مرورگر تغییرات دیده می‌شوند، احتمالاً باید هدرهای کش یا نسخه‌بندی فایل‌ها را اصلاح کنید. اگر تغییری نمی‌بینید، مشکل ممکن است در لایه‌ای دیگر یا حتی در مسیر فایل و فرایند انتشار باشد.

فایل htaccess کجاست و چه پیش‌نیازهایی دارد؟

فایل .htaccess معمولاً در پوشه اصلی سایت قرار دارد؛ همان پوشه‌ای که فایل‌های اصلی وردپرس یا برنامه وب در آن هستند. نام پوشه ممکن است public_html، www یا نام دیگری باشد.

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

اجرای دستورهای این مقاله به چند شرط وابسته است:

  • وب‌سرور باید Apache یا محیطی سازگار با دستورهای مورد استفاده باشد.
  • استفاده از .htaccess و این نوع دستورها باید در تنظیمات سرور مجاز باشد.
  • برای تنظیم هدرها، ماژول mod_headers باید فعال باشد.
  • بخش مربوط به انقضای کش به mod_expires وابسته است.

Nginx به‌صورت مستقیم فایل .htaccess را پردازش نمی‌کند. اگر سایت شما روی Nginx است، باید تنظیم معادل در پیکربندی سرور یا پنل مربوط انجام شود. در محیط‌های سازگار دیگر نیز میزان پشتیبانی به تنظیمات میزبان بستگی دارد.

در وردپرس، کد سفارشی را بیرون از محدوده # BEGIN WordPress و # END WordPress قرار دهید؛ چون وردپرس می‌تواند محتوای آن محدوده را بازنویسی کند.

غیرفعال‌سازی کش در htaccess برای آزمایش کل سایت

برای عیب‌یابی موقت، می‌توانید کد زیر را در فایل .htaccess پوشه اصلی سایت قرار دهید:

<IfModule mod_headers.c>
    Header onsuccess unset Cache-Control
    Header always set Cache-Control "no-store, no-cache, must-revalidate, max-age=0"
</IfModule>

<IfModule mod_expires.c>
    ExpiresActive Off
</IfModule>

این تنظیم از مرورگر و کش‌های واسطی که هدرهای HTTP را رعایت می‌کنند می‌خواهد پاسخ را ذخیره نکنند. همچنین تولید هدرهای انقضا توسط mod_expires را در محدوده مربوط غیرفعال می‌کند.

دستور Header onsuccess unset برای کاهش احتمال وجود هدر تکراری Cache-Control در یکی از مجموعه‌های هدر Apache آمده است؛ بااین‌حال، هدر نهایی را باید پس از اعمال تنظیم بررسی کنید، چون برنامه، میزبان یا CDN ممکن است آن را دوباره تغییر دهد.

معنی بخش‌های اصلی هدر:

  • no-store: پاسخ نباید در کش ذخیره شود.
  • no-cache: استفاده مجدد از پاسخ ذخیره‌شده نیازمند اعتبارسنجی است؛ این عبارت به‌تنهایی به معنی ممنوعیت ذخیره‌سازی نیست.
  • must-revalidate: پاسخ منقضی‌شده نباید بدون اعتبارسنجی دوباره استفاده شود.
  • max-age=0: پاسخ بلافاصله قدیمی محسوب می‌شود.

در این ترکیب، no-store نقش اصلی را در جلوگیری از ذخیره‌سازی دارد. خاموش کردن ExpiresActive به‌تنهایی جایگزین آن نیست و لزوماً هدرهای تنظیم‌شده توسط برنامه یا بخش‌های دیگر سرور را حذف نمی‌کند.

این کد کش قبلی را پاک نمی‌کند. پس از ذخیره فایل، کش افزونه، هاست و CDN را در صورت وجود پاک کنید و با کش غیرفعال مرورگر آزمایش کنید. اگر یک نسخه هنوز تازه تلقی شود، ممکن است اصلاً درخواست جدیدی به سرور نرسد تا مرورگر هدر تازه را دریافت کند.

غیرفعال کردن کش فقط برای CSS و JavaScript

اگر مشکل فقط به نمایش تغییرات ظاهری یا اجرای اسکریپت‌ها مربوط است، محدود کردن تنظیم به فایل‌های CSS و JavaScript انتخاب دقیق‌تری است:

<FilesMatch "\.(css|js)$">
    <IfModule mod_headers.c>
        Header onsuccess unset Cache-Control
        Header always set Cache-Control "no-store, no-cache, must-revalidate, max-age=0"
    </IfModule>

    <IfModule mod_expires.c>
        ExpiresActive Off
    </IfModule>
</FilesMatch>

این نمونه فایل‌هایی را هدف می‌گیرد که نامشان با .css یا .js تمام می‌شود. برای مثال، هنگام اصلاح فاصله‌های یک قالب، می‌توانید موقتاً کش این فایل‌ها را متوقف کنید تا نسخه جدید را بررسی کنید.

کد سراسری بخش قبل و این نسخه محدود را هم‌زمان اضافه نکنید، مگر اینکه عمداً به هر دو نیاز داشته باشید. اگر تنظیم سراسری فعال باشد، محدود کردن کش به CSS و JavaScript معنای عملی موردنظر را نخواهد داشت.

برای صفحات پویا نیز مراقب الگوهای پسوندی باشید. آدرس‌های وردپرس مانند /services/ الزاماً فایل فیزیکی با پسوند .html نیستند؛ بنابراین یک قانون مخصوص فایل‌های HTML لزوماً تمام صفحات سایت را پوشش نمی‌دهد. کنترل کش این صفحات باید متناسب با مسیریابی برنامه و تنظیمات سرور انجام شود.

چگونه مطمئن شویم تنظیمات اعمال شده‌اند؟

دیدن تغییرات کافی نیست؛ بهتر است پاسخ واقعی سرور را بررسی کنید.

۱. ابزار توسعه مرورگر را باز کنید و وارد Network شوید.
۲. کش مرورگر را برای آزمایش غیرفعال کنید.
۳. صفحه را دوباره بارگذاری کنید.
۴. درخواست صفحه یا فایل موردنظر را انتخاب کنید.
۵. در Response Headers مقدار Cache-Control را بخوانید.

برای کد بالا، انتظار دارید هدر شامل no-store باشد. اگر فقط قانون CSS و JavaScript را اعمال کرده‌اید، هدر همان فایل‌ها را بررسی کنید، نه صرفاً سند اصلی صفحه.

در صورت دسترسی به خط فرمان، می‌توانید یک درخواست GET بفرستید و هدرها را ببینید:

curl -sS -D - -o /dev/null https://example.com/style.css

نشانی نمونه را با آدرس واقعی فایل جایگزین کنید. اگر پاسخ تغییر مسیر است، باید هدر مقصد نهایی را نیز بررسی کنید.

وجود عبارت‌هایی مانند from memory cache یا from disk cache در ابزار مرورگر نشان می‌دهد پاسخ از کش محلی آمده است. هدر Age یا هدر اختصاصی CDN نیز ممکن است به تشخیص کش واسط کمک کند، اما نبودن آن‌ها ثابت نمی‌کند هیچ کشی فعال نیست.

پاسخ 304 Not Modified هم به‌خودی‌خود خطا نیست؛ یعنی سرور در فرایند اعتبارسنجی اعلام کرده منبع تغییر نکرده است. اگر نسخه اشتباه نمایش داده می‌شود، باید مسیر فایل، نسخه واقعی و تنظیمات اعتبارسنجی را بررسی کنید.

اگر تغییر htaccess مشکل را حل نکرد، چه کنیم؟

کش وردپرس و فایل‌های بهینه‌شده را پاک کنید

افزونه کش ممکن است HTML قدیمی را تولید کند و افزونه بهینه‌سازی نیز فایل CSS یا JavaScript جداگانه‌ای ساخته باشد. کش هر دو را بررسی کنید. اگر سایت چند لایه بهینه‌سازی دارد، مشخص کنید کدام لایه فایل نهایی را تحویل می‌دهد.

تنظیمات هاست و CDN را بررسی کنید

قوانین CDN ممکن است هدر مبدأ را نادیده بگیرند یا مدت کش مستقلی داشته باشند. کش سرور نیز ممکن است پیش از اجرای برنامه پاسخ دهد. در این شرایط، پاک‌سازی و اصلاح تنظیمات همان لایه ضروری است.

خطای ۵۰۰ را با بازگرداندن نسخه پشتیبان رفع کنید

اگر بلافاصله پس از ویرایش با خطای ۵۰۰ روبه‌رو شدید، تغییرات تازه را حذف یا نسخه پشتیبان را بازگردانید. خطای نگارشی یا مجاز نبودن دستورها از علت‌های ممکن هستند. گزارش خطای سرور می‌تواند علت دقیق‌تر را نشان دهد.

قرار دادن دستورها داخل IfModule فقط نبودن ماژول را مدیریت می‌کند؛ همه خطاهای پیکربندی را خنثی نمی‌کند. همچنین اگر ماژول فعال نباشد، ممکن است بخش مربوط بدون خطا اجرا نشود.

راه‌حل پایدار: نسخه‌بندی فایل‌ها به‌جای خاموش کردن دائمی کش

غیرفعال نگه داشتن کش می‌تواند درخواست‌ها و مصرف پهنای باند را افزایش دهد. پس از رفع مشکل، معمولاً بهتر است کش مناسب را برگردانید و برای فایل‌های تغییرکرده، URL جدید ایجاد کنید.

دو روش رایج عبارت‌اند از:

  • تغییر نام فایل، مانند app.v2.css یا نام مبتنی بر هش محتوا؛
  • افزودن نسخه به آدرس، مانند style.css?ver=2.

روش دوم زمانی مؤثر است که لایه‌های کش، پارامتر نسخه را در کلید کش لحاظ کنند. نام مبتنی بر هش نیز در بسیاری از فرایندهای ساخت پروژه برای همین هدف استفاده می‌شود.

در وردپرس، توابع بارگذاری CSS و JavaScript پارامتر نسخه دارند. استفاده درست از آن کمک می‌کند پس از انتشار تغییرات، مرورگر آدرس جدید را دریافت کند. هدف نهایی، حذف مزیت کش نیست؛ هدف این است که نسخه درست در زمان درست نمایش داده شود.

مایندیو چگونه مدیریت تغییرات سایت را ساده‌تر می‌کند؟

مشکل نمایش تغییرات همیشه با چند خط کد حل نمی‌شود. وقتی طراحی سایت، سئوی فنی و پشتیبانی جداگانه انجام شوند، ممکن است مشخص نباشد بررسی فایل، تنظیمات سرور یا اثر تغییرات بر سایت بر عهده چه کسی است.

مایندیو طراحی سایت شرکتی و فروشگاهی، سایت اختصاصی، سئو و پشتیبانی پس از تحویل را با یک تیم و در یک مسیر انجام می‌دهد. برای سایتی که تغییراتش درست نمایش داده نمی‌شود، مسئله می‌تواند در جلسه شناخت مطرح شود تا نیاز پروژه و مسیر همکاری روشن‌تر شود؛ نه اینکه از ابتدا، خاموش کردن دائمی کش تنها راه‌حل فرض شود.

برای مثال، اگر یک شرکت خدماتی قصد بازطراحی صفحات خود را دارد و هم‌زمان نگران نمایش نسخه قدیمی و حفظ سئو است، خدمات بازطراحی سایت بدون افت سئو و پشتیبانی پس از تحویل مایندیو با این نیاز ارتباط مستقیم دارد. سئوی فنی از روز اول و توضیح به زبان ساده نیز به فهم تصمیم‌های فنی کمک می‌کند.

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

سوالات متداول

آیا غیرفعال‌سازی کش در htaccess کش قبلی را حذف می‌کند؟

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

آیا این روش برای وردپرس کاربرد دارد؟

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

چرا با وجود کد درست، هدر Cache-Control تغییر نمی‌کند؟

ممکن است .htaccess پردازش نشود، ماژول لازم فعال نباشد یا تنظیم دیگری هدر را بازنویسی کند. همچنین احتمال دارد پاسخ از CDN یا کش واسط دریافت شده باشد.

آیا بهتر است کش سایت همیشه غیرفعال باشد؟

معمولاً خیر. برای فایل‌های عمومی و قابل‌کش، نسخه‌بندی و سیاست انقضای مناسب انتخاب بهتری است. صفحات حساس یا شخصی‌سازی‌شده به تنظیمات متفاوت و بررسی مستقل نیاز دارند.

گام بعدی

ابتدا لایه کش مشکل‌ساز را پیدا کنید، تنظیم را موقت و محدود اعمال کنید و نتیجه را از روی هدرها بسنجید. اگر به بازطراحی، بهینه‌سازی یا پشتیبانی سایت نیاز دارید، در درخواست مشاوره رایگان مایندیو وضعیت فعلی سایت و تغییراتی را که نمایش داده نمی‌شوند مطرح کنید تا مسیر مناسب همکاری روشن شود.

پروژه بعدی شما

ایده‌تان را بگویید؛ مسیر طراحی، ساخت و رشدش را با هم روشن می‌کنیم.

جلسه اول رایگان است. در یک گفت‌وگوی کوتاه، نیاز، بودجه و قدم بعدی پروژه‌تان را مشخص می‌کنیم.

درخواست مشاوره رایگان

نویسنده

محمد عسکری

محمد عسکری در مایندیو درباره طراحی سایت، توسعه نرم‌افزار، سئو و رشد کسب‌وکارهای آنلاین می‌نویسد. نوشته‌هایش از دل پروژه‌های واقعی مایندیو می‌آید تا مدیران و صاحبان کسب‌وکار، پیش از هر تصمیم فنی، تصویر روشن‌تری از هزینه، زمان و نتیجه داشته باشند.

همه مقالات

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *