1/* ============================================================================= 2 Dá»° PHÃNG HIá»N THá» PDF â KIá»M TỪ PHÃA TRÃNH DUYá»T (2026-08-12) 3 4 Vì sao phải kiá»m á» trình duyá»t chứ không á» máy chá»§: 5 Khá»i xem PDF trá» tá»i BẢN Äá»M mà máy chá»§ tải vá» (`/upload/pdf/<ngà y>/â¦pdf`). Trên máy chá»§ tháºt cá»§a 6 hcm.edu.vn và thptchuvanan.haiphong.edu.vn, bản Äá»m Äó trả **404** trong khi mã phÃa máy chá»§ lại 7 thấy tá»p tá»n tại (Äã kiá»m: `File.Exists` + kÃch thưá»c > 1KB Äá»u Äạt nên nhánh dá»± phòng phÃa máy chá»§ 8 không kÃch hoạt). NghÄ©a là "máy chá»§ thấy có" â "trình duyá»t tải ÄÆ°á»£c" â nên chá» có phép thá» TỪ TRÃNH 9 DUYá»T má»i Äáng tin. 10 11 Cách là m: má»i khá»i xem PDF ÄÆ°á»£c gắn `data-qi-pdf-dem` (ÄÆ°á»ng dẫn bản Äá»m) và `data-qi-pdf-goc` 12 (Äá»a chá» tá»p gá»c). Tá»p nà y gá»i HEAD tá»i bản Äá»m; không tải ÄÆ°á»£c thì thay cả khá»i bằng 13 `<iframe src="<tá»p gá»c>">` â trình duyá»t má» bằng bá» Äá»c PDF sẵn có, KHÃNG cần CORS (k
13hác pdf.js và 14 flipbook dflip, hai bá» Äó phải Äá»c ÄÆ°á»£c ná»i dung nên vưá»ng CORS vá»i tên miá»n khác). 15 16 Äã kiá»m tá»p gá»c cá»§a cả hai site: `200 · application/pdf · không có X-Frame-Options` â nhúng ÄÆ°á»£c. 17 ========================================================================== */ 18(function () { 19 'use strict'; 20 21 function nhungGoc(khoi, urlGoc) { 22 if (!urlGoc) return; 23 var khung = document.createElement('iframe'); 24 khung.setAttribute('src', urlGoc); 25 khung.setAttribute('title', 'Xem tá»p PDF'); 26 khung.setAttribute('allowfullscreen', 'allowfullscreen'); 27 khung.style.cssText = 'border:0;width:100%;height:920px;min-height:600px;display:block'; 28 // Khá»i flipbook hay ÄÆ°á»£c bá»c trong .heightview/.maincontain có chiá»u cao riêng â thay CHÃNH nó 29 // Äá» không phải Äoán cấu trúc thẻ bá»c. 30 if (khoi.parentNode) khoi.parentNode.replaceChild(khung, khoi); 31 } 32 33 function kiem(khoi) { 34 var dem = khoi.getAttribute('data-qi-pdf-dem'); 35 var goc = khoi.getAttribute('data-qi-pdf-goc'); 36 if (!dem || !goc) return; 37 38 // `cache: 'no-store'` Äá» không Än bản 404 Äã nhá» Äá»m; HEAD cho nhẹ (tá»p PDF có thá» và i MB). 39 // ð´ 405 (máy chá»§ không cho HEAD) KHÃNG phải là "tá»p há»ng" â phải thá» lại bằng GET má»t byte, 40 // nếu không sẽ Äá nhầm cả những bản Äá»m Äang phục vụ tá»t (Äã gặp Äúng lá»i nà y khi kiá»m thá»). 41 function xet(kq, thuLai) { 42 if (kq.status === 405 || kq.status === 501) { if (thuLai) thuLai(); return; } 43 var kieu = (kq.headers.get('content-type') || '').toLowerCase();
44 // Không ok, hoặc máy chá»§ trả trang lá»i HTML thay vì PDF â dùng bản gá»c. 45 if (!kq.ok || (kieu && kieu.indexOf('pdf') < 0)) nhungGoc(khoi, goc); 46 } 47 48 fetch(dem, { method: 'HEAD', cache: 'no-store' }) 49 .then(function (kq) { 50 xet(kq, function () { 51 fetch(dem, { method: 'GET', cache: 'no-store', headers: { Range: 'bytes=0-0' } }) 52 .then(function (kq2) { xet(kq2, null); }) 53 .catch(function () { nhungGoc(khoi, goc); }); 54 }); 55 }) 56 .catch(function () { nhungGoc(khoi, goc); }); 57 } 58 59 function chay() { 60 var ds = document.querySelectorAll('[data-qi-pdf-dem][data-qi-pdf-goc]'); 61 for (var i = 0; i < ds.length; i++) kiem(ds[i]); 62 } 63 64 if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', chay); 65 else chay(); 66})();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.