前端JavaScript解決防盜鏈(Referer Check)圖片加載問題的常用方法
防盜鏈(Referer Check)是服務(wù)器通過檢查請(qǐng)求頭中的 Referer 字段,來判斷請(qǐng)求是否來自合法的來源。如果圖片服務(wù)器啟用了防盜鏈機(jī)制,而你的請(qǐng)求沒有正確的 Referer 或者 Referer 不在允許的列表中,圖片就無法加載。
以下是解決防盜鏈圖片問題的幾種方法:
1.設(shè)置正確的Referer
如果圖片服務(wù)器允許某些特定的 Referer,你可以在請(qǐng)求中設(shè)置正確的 Referer 字段。
方法
使用 <meta> 標(biāo)簽設(shè)置全局 Referer:
<meta name="referrer" content="origin" />
或者:
<meta name="referrer" content="no-referrer-when-downgrade" />
在請(qǐng)求中動(dòng)態(tài)設(shè)置 Referer:
如果你是通過 JavaScript 動(dòng)態(tài)加載圖片,可以使用 fetch 或 XMLHttpRequest 設(shè)置請(qǐng)求頭:
fetch(imageUrl, {
headers: {
Referer: "https://your-allowed-domain.com",
},
});
2.使用代理服務(wù)器
如果圖片服務(wù)器對(duì) Referer 的限制非常嚴(yán)格,你可以通過自己的服務(wù)器代理請(qǐng)求圖片。
方法:
在你的服務(wù)器上設(shè)置一個(gè)代理接口,前端請(qǐng)求你的服務(wù)器,服務(wù)器再去請(qǐng)求圖片并返回給前端。
示例(Node.js + Express):
const express = require("express");
const axios = require("axios");
const app = express();
app.get("/proxy-image", async (req, res) => {
const imageUrl = req.query.url;
try {
const response = await axios.get(imageUrl, {
responseType: "arraybuffer",
headers: {
Referer: "https://your-allowed-domain.com",
},
});
res.set("Content-Type", "image/jpeg");
res.send(response.data);
} catch (error) {
res.status(500).send("Failed to load image");
}
});
app.listen(3000, () => {
console.log("Proxy server running on port 3000");
});
前端調(diào)用:
<img
:src="`/proxy-image?url=${scope.row.avatar}`"
style="width: 50px; height: 50px; border-radius: 50%"
/>
3.使用no-referrer策略
如果圖片服務(wù)器允許無 Referer 的請(qǐng)求,可以通過設(shè)置 referrerpolicy 屬性來禁用 Referer。
方法:
在 <img> 標(biāo)簽中添加 referrerpolicy 屬性:
<img :src="scope.row.avatar" style="width: 50px; height: 50px; border-radius: 50%" referrerpolicy="no-referrer" />
或者在 JavaScript 中動(dòng)態(tài)設(shè)置:
const img = new Image(); img.src = imageUrl; img.referrerPolicy = "no-referrer";
4.將圖片轉(zhuǎn)換為 Base64
如果圖片較小,可以將圖片轉(zhuǎn)換為 Base64 編碼,直接嵌入到頁面中,避免發(fā)送額外的請(qǐng)求。
方法:
使用工具或代碼將圖片轉(zhuǎn)換為 Base64 字符串。
示例:
<img src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD..." style="width: 50px; height: 50px; border-radius: 50%" />
5.聯(lián)系圖片服務(wù)器管理員
如果以上方法都無法解決問題,可以嘗試聯(lián)系圖片服務(wù)器的管理員,申請(qǐng)將你的域名加入白名單。
6.使用第三方服務(wù)
一些第三方服務(wù)(如 Cloudflare、imgix 等)可以幫助處理防盜鏈問題。你可以將圖片 URL 通過第三方服務(wù)代理,從而繞過防盜鏈限制。
總結(jié)
- 如果圖片服務(wù)器允許無
Referer請(qǐng)求,優(yōu)先使用referrerpolicy="no-referrer"。 - 如果需要更高的靈活性,可以使用代理服務(wù)器。
- 如果圖片較小,可以考慮轉(zhuǎn)換為 Base64。
- 如果問題復(fù)雜,聯(lián)系圖片服務(wù)器管理員或使用第三方服務(wù)。
到此這篇關(guān)于前端JavaScript解決防盜鏈(Referer Check)圖片加載問題的常用方法的文章就介紹到這了,更多相關(guān)JavaScript防盜鏈內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JS教程:window.location使用方法的區(qū)別介紹
這篇文章介紹了window.location使用方法的區(qū)別,有需要的朋友可以參考一下2013-10-10
實(shí)現(xiàn)動(dòng)畫效果核心方式的js代碼
為了做好導(dǎo)航菜單,有時(shí)候需要在菜單下拉的時(shí)候?qū)崿F(xiàn)動(dòng)畫效果,所以這幾天就研究了研究如何用js實(shí)現(xiàn)動(dòng)畫效果,實(shí)現(xiàn)動(dòng)畫核心要用到兩個(gè)函數(shù),一個(gè)是setTimeOut,另一個(gè)是setInterval2013-09-09
JavaScript利用正則表達(dá)式替換字符串中的內(nèi)容
本文主要介紹了JavaScript利用正則表達(dá)式替換字符串中內(nèi)容的具體實(shí)現(xiàn)方法,并做了簡(jiǎn)要注釋,便于理解。具有一定的參考價(jià)值,需要的朋友可以看下2016-12-12
詳解關(guān)于微信setData回調(diào)函數(shù)中的坑
這篇文章主要介紹了詳解關(guān)于微信setData回調(diào)函數(shù)中的坑,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-02-02
javascript解析ajax返回的xml和json格式數(shù)據(jù)實(shí)例詳解
這篇文章主要介紹了javascript解析ajax返回的xml和json格式數(shù)據(jù),結(jié)合實(shí)例形式詳細(xì)分析了JS ajax調(diào)用及返回值中xml與json格式數(shù)據(jù)的處理技巧,需要的朋友可以參考下2017-01-01
可能是全網(wǎng)最詳細(xì)小程序中使用echarts的教程
在開發(fā)微信小程序時(shí),有需求需要使用到柱狀圖,餅圖等圖表,下面這篇文章主要給大家介紹了關(guān)于小程序中使用echarts的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-10-10
javascript之水平橫向滾動(dòng)歌詞同步的應(yīng)用
javascript之水平橫向滾動(dòng)歌詞同步的應(yīng)用...2007-05-05

