Score:0

การเพิ่มบล็อกตำแหน่งไปยังไฟล์แคชทำให้ไฟล์เหล่านั้นส่งคืน 404

ธง in

ฉันต้องการแคชไฟล์คงที่โดยใช้ Nginx แต่ฉันไม่สามารถทำให้มันใช้งานได้

นี่เป็นของฉัน nginx.conf:

ผู้ใช้ www-data;
worker_processes อัตโนมัติ
pid /run/nginx.pid;
รวม /etc/nginx/modules-enabled/*.conf;

เหตุการณ์ {
    worker_connections 768;
    #multi_accept บน;
}


http {

    #GZIP
    เปิด gzip;
    gzip_vary บน;
    gzip_proxyed ใด ๆ ;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_min_length 256;
    แอปพลิเคชัน gzip_types/แอปพลิเคชัน javascript/แอปพลิเคชัน json/แอปพลิเคชัน ld+json/แบบอักษร xml/แบบอักษร eot/แบบอักษร otf/ข้อความ ttf/ข้อความ css/ข้อความจาวาสคริปต์/ข้อความธรรมดา/xml;

    # เซิร์ฟเวอร์
    เซิร์ฟเวอร์ {
            ฟัง 80;

        server_name example.com;
        ถ้า ($http_host ~* ^www\.(.*)$ )
        {
            ส่งคืน 301 https://$1$request_uri;
        }

        ส่งคืน 301 https://$http_host$request_uri;
    }
    เซิร์ฟเวอร์ {
        ฟัง 443 ssl;

        ถ้า ($http_host ~* ^www\.(.*)$ )
        {
            ส่งคืน 301 $scheme://$1$request_uri;
        }


        #SSL
        ssl_certificate /root/.acme.sh/example.com/fullchain.cer;
        ssl_certificate_key /root/.acme.sh/example.com/example.com.key;

        server_name example.com;

        # ส่งทราฟฟิกทั้งหมดไปยังเว็บแอปพลิเคชันของฉัน
        ที่ตั้ง / {
            proxy_set_header โฮสต์ $host;
            proxy_pass http://localhost:8080;
        }

        #เบราว์เซอร์แคช
        ตำแหน่ง ~* \.(js|css)$ {
            หมดอายุ 180d;
            add_header Pragma "สาธารณะ";
            add_header แคชควบคุม "สาธารณะ";
        }
        ตำแหน่ง ~* \.(jpg|jpeg|png|webp|woff|woff2|ttf)$ {
            หมดอายุ 365d;
            add_header Pragma "สาธารณะ";
            add_header แคชควบคุม "สาธารณะ";
        }

    }
}

ปัญหาอยู่ที่ส่วน "การแคชเบราว์เซอร์" เมื่อเปิดใช้งานบล็อกโค้ดนี้ เว็บไซต์ของฉันโหลด แต่ไฟล์ css, ไฟล์จาวาสคริปต์ และรูปภาพทั้งหมดส่งคืน 404 มันเหมือนกับว่าไฟล์เหล่านั้นไม่สนใจฉัน ที่ตั้ง /.

ฉันสามารถแก้ไขปัญหานี้ได้โดยการคัดลอก/วาง

proxy_set_header โฮสต์ $host;
proxy_pass http://localhost:8080;

ในทั้งหมดของฉัน ที่ตั้ง-บล็อก แต่นั่นไม่ได้สวยงามนักและทำให้เว็บไซต์ของฉันช้าลงมาก...

ฉันยังพยายามย้ายทั้งสอง ที่ตั้ง-บล็อกสำหรับเบราว์เซอร์ที่แคชในบล็อก ที่ตั้ง \ ดังนั้นคนหลังจะทำหน้าที่เป็น 'ผู้ปกครอง' แต่นั่นไม่ได้ทำให้พฤติกรรมของรูปภาพ ฯลฯ กลับ 404

ฉันจะกำหนดค่าการแคชไฟล์สแตติกใน Nginx ได้อย่างไร

แก้ไข: ฉันเพิ่มสิ่งต่อไปนี้ในของฉัน http-บล็อก:

  แผนที่ $uri $cache_control {
                ~/Website/assets/media/images "สาธารณะ ไม่มีการเปลี่ยนแปลง";
        }
        แผนที่ $uri $หมดอายุ {
            ~/เว็บไซต์/สินทรัพย์/สื่อ/รูปภาพ 365d;
        }

เพิ่มสิ่งต่อไปนี้ในของฉัน เซิร์ฟเวอร์-บล็อก:

 หมดอายุ $expire;
                add_header แคชควบคุม $cache_control;

ไม่มีอะไรถูกแคช

Ivan Shatsky avatar
gr flag
เว็บแอปแบ็กเอนด์ของคุณคืออะไร อะไรทำให้คุณไม่สามารถให้บริการไฟล์สแตติกด้วย nginx โดยไม่ต้องเรียกแบ็กเอนด์อย่างที่ Tero Kilkanen แนะนำ
O'Niel avatar
in flag
เว็บแอปส่วนหลังของฉันคือแอปพลิเคชันสนิม และ URL ที่พบทรัพยากร/ไฟล์ไม่เหมือนกับตำแหน่งจริงบนเซิร์ฟเวอร์ ฉันเขียนการเข้าถึงและเส้นทางทรัพยากรใหม่ในเส้นทางเว็บ
Ivan Shatsky avatar
gr flag
ตกลง หากคุณไม่สามารถให้บริการเนื้อหาคงที่ของคุณโดยใช้ nginx เท่านั้น และควรพร็อกซีคำขอทั้งหมดไปยังแบ็กเอนด์ ให้เลือกคำตอบ [นี้](https://stackoverflow.com/a/64287782/7121513) ฉันคิดว่านี่คือสิ่งที่คุณขอ (ต้องการการปรับตัวน้อยที่สุด)
O'Niel avatar
in flag
@IvanShatsky ดูการแก้ไข ไฟล์ไม่ได้รับการแคช
Ivan Shatsky avatar
gr flag
เพิ่ม `default off;` ลงในบล็อก `map $uri $expire { ... }`คำนำหน้า `/Website` คืออะไร เป็นส่วนหนึ่งของ URI จริงๆ ไม่ใช่ชื่อโดเมนใช่หรือไม่ ตรวจสอบว่าส่วนหัวการตอบสนองที่จำเป็นมีอยู่ในเบราว์เซอร์ DevTools หรือ curl หรือไม่ คุณแน่ใจหรือว่าแอปแบ็กเอนด์ไม่ได้เพิ่มสิ่งเหล่านี้เอง
O'Niel avatar
in flag
ฉันคิดว่าเส้นทางนั้นเป็นเส้นทางจริงของไฟล์บน VPS ฉันลบส่วน `เว็บไซต์` ออกแล้ว และตอนนี้มันใช้งานได้แล้ว! ขอบคุณ!
Ivan Shatsky avatar
gr flag
เนื่องจากคุณได้เริ่มรางวัลแล้ว คุณจะไม่คิดไหมถ้าฉันจะเขียนมันเป็นคำตอบ? :) ฉันจะใช้บล็อก "แผนที่" ที่แตกต่างกันเล็กน้อยเพื่อตอบคำถามเดิมของคุณ โดยที่ JS/CSS และไฟล์รูปภาพควรได้รับค่าส่วนหัว "หมดอายุ" ที่แตกต่างกัน
O'Niel avatar
in flag
@IvanShatsky แน่นอนเพื่อน ความช่วยเหลือของคุณได้รับการชื่นชม
Score:1
ธง gr

หากคุณไม่สามารถให้บริการทรัพย์สินคงที่โดยตรงจากระบบไฟล์ผ่าน nginx อย่างที่ @TeroKilkanen แนะนำ คุณสามารถใช้เทคนิคที่คล้ายกับที่แสดงใน นี้ คำตอบ:

แผนที่ $uri $หมดอายุ {
    ~\.(?:j|cs)s$ 180d;
    ~\.(?:jpe?g|png|webp|woff2?|ttf)$ 365d;
    ปิดโดยปริยาย;
}
แผนที่ $uri $cache_control {
    ~\.(?:js|css|jpe?g|png|webp|woff2?|ttf)$ สาธารณะ;
}
เซิร์ฟเวอร์ {
    ...
    หมดอายุ $expire;
    add_header Pragma $cache_control;
    add_header แคชควบคุม $cache_control;
    ...
}

หาก URI คำขอของคุณไม่ตรงกับ regex $cache_control ตัวแปรจะมีค่าว่างและ nginx จะไม่เพิ่ม ปรากมา และ การควบคุมแคช มุ่งตอบสนองของมันเลย

Score:1
ธง us

สิ่งนี้ไม่ได้ตอบคำถามของคุณจริง ๆ แต่แสดงวิธีที่ต้องการในการให้บริการเนื้อหาคงที่ด้วย nginx

เนื่องจากดูเหมือนว่าคุณกำลังเรียกใช้เว็บแอปพลิเคชันบนโฮสต์เดียวกัน ฉันขอแนะนำให้คุณให้บริการไฟล์สแตติกโดยตรงโดยใช้ nginx

รูท /path/to/webroot;

ตำแหน่ง ~* \.(js|jss)$ {
    หมดอายุ 180d;
    add_header Pragma "สาธารณะ";
    add_header แคชควบคุม "สาธารณะ;

    try_files $uri =404;
}

ตำแหน่ง ~* \.(jpg|jpeg|png|webp|woff|woff2|ttf)$ {
    หมดอายุ 365d;
    add_header Pragma "สาธารณะ";
    add_header แคชควบคุม "สาธารณะ";

    try_files $uri =404;
}

อันนี้ยังมีคำจำกัดความที่ซ้ำกันสำหรับการแคช คุณสามารถกำจัดการทำซ้ำบางส่วนได้โดยการระบุคำสั่งในไฟล์แยกต่างหากและใช้ รวม เพื่อรวมไฟล์ไว้ในการกำหนดค่าของคุณ

คุณจะป้อนข้อมูลต่อไปนี้เพื่อ proxy_header.conf ไฟล์:

add_header Pragma "สาธารณะ";
add_header แคชควบคุม "สาธารณะ";

และในการกำหนดค่าของคุณ:

ตำแหน่ง ~* ... {
    รวม /path/to/webroot;
    หมดอายุ 365d;
}

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา