Custom 503 Error Page ด้วยวานิช


15

ฉันจะบอกให้วานิชแสดงหน้าข้อผิดพลาด html ที่กำหนดเองแทนที่จะเป็นข้อความ "Guru Meditation" ที่เป็นค่าเริ่มต้นได้อย่างไร


สามารถทำได้ด้วยบางแบบอินไลน์ C ดู: mohanjith.net/blog/2009/08/...
3molo

ขอบคุณทำไมคุณไม่แสดงความคิดเห็นนั้นเป็นคำตอบที่แนะนำ
Christian Davén

คำตอบ:


13

วานิชคำถามที่พบบ่อยแนะนำให้ใช้สำหรับ vcl_error นี้ (และมันเป็นวิธีที่ผมเคยทำก่อน):

นี่คือ VCL เริ่มต้นสำหรับหน้าข้อผิดพลาด:

sub vcl_error {
    set obj.http.Content-Type = "text/html; charset=utf-8";

    synthetic {"
        <?xml version="1.0" encoding="utf-8"?>
        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
            "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
        <html>
            <head>
                <title>"} obj.status " " obj.response {"</title>
            </head>
            <body>
                <h1>Error "} obj.status " " obj.response {"</h1>
                <p>"} obj.response {"</p>
                <h3>Guru Meditation:</h3>
                <p>XID: "} req.xid {"</p>
                <address><a href="http://www.varnish-cache.org/">Varnish</a></address>
            </body>
        </html>
    "};
    return(deliver);
}

หากคุณต้องการรุ่นที่กำหนดเองเพียงแค่แทนที่ฟังก์ชั่นในการกำหนดค่าของคุณและแทนที่มาร์กอัปในsyntheticคำสั่ง

หากคุณต้องการมีมาร์กอัปที่แตกต่างกันสำหรับรหัสข้อผิดพลาดที่แตกต่างกันคุณสามารถทำได้อย่างง่ายดายเช่นกัน:

sub vcl_error {
    set obj.http.Content-Type = "text/html; charset=utf-8";
    if (obj.status == 404) {
        synthetic {"
            <!-- Markup for the 404 page goes here -->
        "};
    } else if (obj.status == 500) {
        synthetic {"
            <!-- Markup for the 500 page goes here -->
        "};
    } else {
        synthetic {"
            <!-- Markup for a generic error page goes here -->
        "};
    }
}

สิ่งนี้ใช้ไม่ได้กับ VCL 4.0 - ถ้าคุณใช้ vcl 4.0 ให้ดูคำตอบด้านล่าง
ฟิลิปป์

18

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

หวังว่านี่จะช่วยผู้คนจากการอ่านคำตอบข้างต้นและนำ vcl_error ไปไว้ใน V4 VCL ของพวกเขา :)

Builtin VCL สำหรับวานิช 4.0

sub vcl_synth {
    set resp.http.Content-Type = "text/html; charset=utf-8";
    set resp.http.Retry-After = "5";
    synthetic( {"<!DOCTYPE html>
<html>
  <head>
    <title>"} + resp.status + " " + resp.reason + {"</title>
  </head>
  <body>
    <h1>Error "} + resp.status + " " + resp.reason + {"</h1>
    <p>"} + resp.reason + {"</p>
    <h3>Guru Meditation:</h3>
    <p>XID: "} + req.xid + {"</p>
    <hr>
    <p>Varnish cache server</p>
  </body>
</html>
"} );
    return (deliver);
}

โปรดทราบด้วยว่าหากคุณต้องการทิ้งข้อผิดพลาดจากภายใน VCL ของคุณคุณจะไม่ใช้ฟังก์ชัน 'ข้อผิดพลาด' อีกต่อไปแทน:

return (synth(405));

นอกจากนี้ข้อผิดพลาด 413, 417 และ 503 จากแบ็กเอนด์จะถูกส่งแบบอัตโนมัติผ่าน funtion นี้


โปรดทราบว่าสิ่งนี้จะไม่จับ "ข้อผิดพลาดในการดึงข้อมูลแบ็กเอนด์" ในการจับภาพคุณต้องสร้าง a sub vcl_backend_errorตามที่เห็นในserverfault.com/a/665917/102757และserverfault.com/a/716767/102757
lucaferrario
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.