নোডজেএস / এক্সপ্রেস: ক্যাশে এবং 304 স্থিতি কোড


92

আমি যখন এক্সপ্রেস দিয়ে তৈরি কোনও ওয়েবসাইট পুনরায় লোড করি তখন আমি সাফারি (ক্রোমের সাথে নয়) এর সাথে একটি ফাঁকা পৃষ্ঠা পাই কারণ নোডজেএস সার্ভার আমাকে 304 স্থিতি কোড প্রেরণ করে।

কীভাবে সমাধান করবেন?

অবশ্যই এটি কেবল সাফারির সমস্যা হতে পারে তবে এটি অন্য সমস্ত ওয়েবসাইটে সূক্ষ্মভাবে কাজ করে, সুতরাং এটি আমার নোডজেএস সার্ভারেও সমস্যা হতে পারে।

পৃষ্ঠাগুলি তৈরি করতে, আমি জেড এর সাথে ব্যবহার করছি res.render

আপডেট: মনে হচ্ছে এই সমস্যাটি দেখা দেয় কারণ সাফারি 'cache-control': 'max-age=0'পুনরায় লোড প্রেরণ করে।

আপডেট 2: আমার এখন একটি কার্যনির্বাহী রয়েছে, তবে এর থেকে আরও ভাল সমাধান কি আছে? কার্যকারিতা:

app.get('/:language(' + content.languageSelector + ')/:page', function (req, res)
{
    // Disable caching for content files
    res.header("Cache-Control", "no-cache, no-store, must-revalidate");
    res.header("Pragma", "no-cache");
    res.header("Expires", 0);

    // rendering stuff here…
}

আপডেট 3: সুতরাং সম্পূর্ণ কোড অংশটি বর্তমানে:

app.get('/:language(' + content.languageSelector + ')/:page', pageHandle);

function pageHandle (req, res)
{
    var language = req.params.language;
    var thisPage = content.getPage(req.params.page, language);

    if (thisPage)
    {
        // Disable caching for content files
        res.header("Cache-Control", "no-cache, no-store, must-revalidate");
        res.header("Pragma", "no-cache");
        res.header("Expires", 0);

        res.render(thisPage.file + '_' + language, {
            thisPage : thisPage,
            language: language,
            languages: content.languages,
            navigation: content.navigation,
            footerNavigation: content.footerNavigation,
            currentYear: new Date().getFullYear()
        });
    }
    else
    {
        error404Handling(req, res);
    }
}

4
304 কোনও সমস্যা নয়। এর সহজ অর্থ হ'ল আপনার প্রতিক্রিয়া পরিবর্তন করা হয়নি এবং আপনার ব্রাউজারটি সংস্থানটি আনতে ক্যাশে পরিণত হয়েছে। আপনি কি প্রাসঙ্গিক কোড পোস্ট করতে পারেন যাতে অসাধারণতা ঘটছে।
অক্ষত জিওয়ান শর্মা

4
হ্যাঁ, আসলে এটি সংশোধিত হয়নি, তবে সাফারি তার ক্যাশে সিএমডি + আর (রিলোড) খালি করে এবং সার্ভারটি কেবল বলে যে এটি পরিবর্তন হয়নি।
h345k34cr

304 স্থিতি কোডের সাথে ফাঁকা পৃষ্ঠা কীভাবে সম্পর্কিত? নোড 304 অন্যান্য ব্রাউজারে প্রেরণ করবে।
ব্যবহারকারীর 568109

4
এটি সম্পর্কিত কারণ 304 দিয়ে দেহ প্রেরণ করা হয়নি এবং ব্রাউজারটি তার ক্যাশে ব্যবহার করে, তবে যেহেতু কোনও ক্যাশে নেই, আপনি একটি ফাঁকা পৃষ্ঠা পাবেন
h345k34cr

4
@ক্ষতজীবনশর্মা কোনও প্রোগ্রামই সেই পণ্য মালিকের চুক্তিটি হুবহু মেনে চলার জন্য বিকাশিত হয়। পণ্যটির মালিক হলেন তিনিই কোডটির মালিক এবং অর্থ প্রদান করেন, এমন কোনও সংস্থা নয় যা কাগজপত্র লেখেন যার বিষয়ে কেউ চিন্তা করে না। যদি চুক্তিটি "200" বলে থাকে তবে একেবারে কোনও স্থিতি যা "200" এর সমান নয় এটি একটি বাগ is যখন কোনও বাগ থাকে তখন আমি পুনর্লিখনের কোডটি অবশ্যই আবশ্যক যতক্ষণ না প্রত্যাশার সবকিছু ঠিক থাকে। W3C এর বিষয়ে কোনও বক্তব্য নেই।
গেরম্যান

উত্তর:


107

সবচেয়ে সহজ সমাধান:

app.disable('etag');

আপনি আরও নিয়ন্ত্রণ চান এখানে বিকল্প সমাধান:

http://vlasenko.org/2011/10/12/expressconnect-static-set-last-modified-to-now-to-avoid-304-not-modified/


4
আপনি কি "সবচেয়ে সহজ সমাধান" ব্যাখ্যা করতে পারেন বা এটি কীভাবে প্রভাবিত করে তার একটি রেফারেন্স দিতে পারেন?
স্যামুয়েল মান্দেজ

4
@ SamuelMéndez এটি মূলত ক্যাশে পঙ্গু, etag উপর উইকি ভাল তথ্য অনেক আছে en.wikipedia.org/wiki/HTTP_ETag
blented

আমার জন্য কাজ করেছেন :)
নবীন কুমার ভি

3

যেমনটি আপনি বলেছেন, সাফারি Cache-Control: max-age=0পুনরায় লোড প্রেরণ করে। এক্সপ্রেস (বা আরও সুনির্দিষ্টভাবে, এক্সপ্রেসের নির্ভরতা, নোড-ফ্রেশ) Cache-Control: no-cacheশিরোনামগুলি প্রাপ্ত হওয়ার পরে ক্যাশে বাসি বিবেচনা করে তবে এটি এর জন্য একই করে না Cache-Control: max-age=0। আমি যা বলতে পারি তা থেকে সম্ভবত এটি করা উচিত। তবে আমি ক্যাচিংয়ে বিশেষজ্ঞ নই।

ফিক্সটি হ'ল লাইন 37 এর (বর্তমানে কী রয়েছে) পরিবর্তন node-fresh/index.jsকরা

if (cc && cc.indexOf('no-cache') !== -1) return false;  

প্রতি

if (cc && (cc.indexOf('no-cache') !== -1 ||
  cc.indexOf('max-age=0') !== -1)) return false;

আমি নোড-ফ্রেশ এবং আমার প্রকল্পের package.jsonমাধ্যমে এই ফিক্সটি অন্তর্ভুক্ত করার জন্য প্রকাশ করেছি, আপনিও npmএটি করতে পারেন। এখানে আমার কাঁটাচামচ, উদাহরণস্বরূপ:

https://github.com/stratusdata/node-fresh https://github.com/stratusdata/express#safari-reload-fix

সাফারি-রিলোড-ফিক্স শাখাটি 3.4.7 ট্যাগের উপর ভিত্তি করে।


মহান কাজ! আমি দেখতে পাচ্ছি যে এক্সপ্রেস 3.5.1 নোড-তাজা 0.2.2 এর মাধ্যমে আপনার ফিক্সটি অন্তর্ভুক্ত করে।
ক্লাফু

প্রকৃতপক্ষে, আমি ভুল, আপনার ফিক্সটি উল্টানো হয়েছিল এবং আসলে এটি 0.2.2-এ পরিণত হয়নি। এখনও কোন টাটকা / এক্সপ্রেস ফিক্স নেই।
ক্লাফু

2

সাফারি এবং ক্রোমে আমার একই সমস্যা ছিল (কেবলমাত্র আমিই এটি পরীক্ষা করেছি) তবে সমাধানটি যুক্ত করার পরে আমি কেবল এমন কিছু করেছি যা কাজ করে বলে মনে হচ্ছে, কমপক্ষে আমি সমস্যার পুনরুত্পাদন করতে সক্ষম হইনি। আমি যা করেছি তা হ'ল উত্পন্ন টিমস্ট্যাম্প সহ শিরোনামে একটি মেটাট্যাগ যুক্ত করা। সঠিক মনে হচ্ছে না তবে এটি সহজ :)

<meta name="304workaround" content="2013-10-24 21:17:23">

পিএস আপডেট করুন যতদূর আমি বলতে পারি, সমস্যাটি যখন আমার নোড প্রক্সিটি সরিয়ে ফেলবে (প্রক্সি দ্বারা আমি এক্সপ্রেস.ভোস্ট এবং HTTP- প্রক্সি মডিউল উভয়ই বোঝাব), যা অদ্ভুত ...


আমি অ্যাপাচি প্রক্সিও ব্যবহার করি, এটি সমস্যা হতে পারে। আমার কাজের ভিত্তিটি হ'ল এইচডিপি শিরোলেখ সহ সামগ্রীর সাইটগুলির জন্য ক্যাশে অক্ষম করা ছিল।
h345k34cr

শিরোনামগুলির মাধ্যমে ক্যাশে অক্ষম করা অবশ্যই যাওয়ার উপায়। প্রথমে এটি আমার পক্ষে কাজ করেনি তবে এখন তা করে। অন্য কথায় আমি অবশ্যই প্রথমবারের কাছাকাছি কোথাও একটি ভুল করেছি :)
ব্যবহারকারী 907567

1

সাফারিতে ব্যক্তিগত ব্রাউজিং ব্যবহার করার বা আপনার সম্পূর্ণ ক্যাশে / কুকিজ মুছতে চেষ্টা করুন।

ক্রোম ব্যবহার করে আমার কিছু অনুরূপ সমস্যা হয়েছিল যখন ব্রাউজারটি মনে করেছিল এটির ক্যাশে ওয়েবসাইট রয়েছে তবে বাস্তবে তা ছিল না।

HTTP অনুরোধের যে অংশটি সার্ভারকে 304 সাড়া দেয় তা হ'ল ইটাগ। দেখে মনে হচ্ছে সাফারি সম্পর্কিত ক্যাশে না করে সঠিক ইটাগ পাঠাচ্ছে।


আমি যখন পুরো ক্যাশে মুছে ফেলার চেষ্টা করেছি তখন এটি আমার পক্ষে কাজ করে, ধন্যবাদ
ইউটানান্ট সুওয়ানসিরি

0

পুরানো প্রশ্ন, আমি জানি। ক্যাশে সুবিধাটি অক্ষম করার দরকার নেই এবং সমস্যাটি পরিচালনা করার সর্বোত্তম উপায় নয়। ক্যাশে সুবিধাটি অক্ষম করে সার্ভারের আরও কঠোর পরিশ্রম করা প্রয়োজন এবং আরও ট্র্যাফিক তৈরি করে। এছাড়াও ব্রাউজার এবং ডিভাইসটিকে আরও কঠোর পরিশ্রম করা দরকার, বিশেষত মোবাইল ডিভাইসে এটি কোনও সমস্যা হতে পারে।

ব্রাউজারে শিফট কী + রিলোড লোড বোতামটি ব্যবহার করে খালি পৃষ্ঠাটি সহজেই সমাধান করা যায়।

খালি পৃষ্ঠাটির ফলাফল হতে পারে:

  • আপনার কোডে একটি বাগ
  • পরীক্ষার সময় আপনি একটি খালি পৃষ্ঠা পরিবেশন করেছেন (আপনি মনে করতে পারবেন না) যা ব্রাউজার দ্বারা ক্যাশে হয়েছে
  • সাফারিতে একটি বাগ (যদি তা হয় তবে দয়া করে এটি অ্যাপলকে জানান এবং এটি নিজেই ঠিক করার চেষ্টা করবেন না)

প্রথমে শিফট কীবোর্ড কী + পুনরায় লোড বোতামটি ব্যবহার করে দেখুন এবং সমস্যাটি এখনও রয়েছে কিনা তা দেখুন এবং আপনার কোডটি পর্যালোচনা করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.