Forum Moderators: open
addEventListener('fetch', event => {
event.respondWith(fetchAndApply(event.request))
})
async function fetchAndApply(request) {
let referer = request.headers.get('Referer')
// check if there is a user agent
if (request.headers.get('user-agent')) {
// if a search engine allow request
if ((request.headers.get('user-agent').includes('googlebot')) || (request.headers.get('user-agent').includes('msn')) || (request.headers.get('user-agent').includes('yandex'))) {
return fetch(request)
} else {
//check if there is a referer
if (referer) {
// It's an image and there's a Referer. Verify that the
// hostnames match.
if (new URL(referer).hostname ==
new URL(request.url).hostname) {
return fetch(request)
} else {
console.log('referer',referer)
// Hosts don't match. This is a hotlink. Redirect the
// user to our 404.
return new Response('Sorry, this page is not available at this time.', {
status: 404,
headers: {
'Location': '/404'
}
})
}
}
}
}
else {
console.log('referer',referer)
// `No Useragent. Redirect to
// 404
return new Response('Sorry, this page is not available at this time.', {
status: 404,
headers: {
'Location': '/404'
}
})
}
}
addEventListener('fetch', event => {
event.respondWith(fetchAndApply(event.request))
})
async function fetchAndApply(request) {
let referer = request.headers.get('Referer')
if (request.headers.get('user-agent')) {
if ((request.headers.get('user-agent').includes('googlebot')) || (request.headers.get('user-agent').includes('msn')) || (request.headers.get('user-agent').includes('yandex'))) {
return fetch(request)
} else {
if (referer) {
// It's an image and there's a Referer. Verify that the
// hostnames match.
if (new URL(referer).hostname ==
new URL(request.url).hostname) {
return fetch(request)
} else {
console.log('referer',referer)
// Hosts don't match. This is a hotlink. Redirect the
// user to our homepage.
return new Response('Sorry, this image is not available at this time.', {
status: 403,
headers: {
'Location': '/403'
}
})
}
}
}
}
else {
console.log('referer',referer)
// Hosts don't match. This is a hotlink. Redirect the
// user to our homepage.
return new Response('Sorry, this image is not available at this time.', {
status: 403,
headers: {
'Location': '/403'
}
})
}
}
If one accepts that a 404 is "temporarily moved"
My browser doesn't send a referer...That's the problem. In these times of HTTPS and various security headers, most requests do not include a referer so anti-hotlinking measures are no longer the smart move.
most requests do not include a referer
addEventListener('fetch', event => {
event.respondWith(fetchAndApply(event.request))
})
async function fetchAndApply(request) {
let referer = request.headers.get('Referer')
let urlreq = new URL(request.url).hostname
if (request.headers.get('user-agent')) {
if ((request.headers.get('user-agent').includes('googlebot')) || (request.headers.get('user-agent').includes('bingbot')) || (request.headers.get('user-agent').includes('pinterest')) || (request.headers.get('user-agent').includes('facebookfacebookexternalhit')) || (request.headers.get('user-agent').includes('facebook')) || (request.headers.get('user-agent').includes('twitter')) || (request.headers.get('user-agent').includes('GoogleImageProxy')) || (request.headers.get('user-agent').includes('yandex'))) {
return fetch(request)
} else {
if (referer) {
// It's an image and there's a Referer. Verify that the host
if (new URL(referer).hostname ==
new URL(request.url).hostname) {
return fetch(request)
// Else if its pinterest
} else if (new URL(request.url).hostname = 'pinterest.com') {
return fetch(request)
// Else if its twiiter
} else if (new URL(request.url).hostname = 'twitter.com') {
return fetch(request)
// Else if its google
} else if (new URL(request.url).hostname = 'google.com') {
return fetch(request)
// Else if its bing
} else if (new URL(request.url).hostname = 'bing.com') {
return fetch(request)
} else {
console.log('referer',referer)
// Hosts don't match. This is a hotlink and its not a friendly search bot or social media
return new Response('Sorry, this image is not available at this time.', {
status: 403,
})
}
}
}
}
else {
console.log('referer',referer)
// No useragent
return new Response('Sorry, this image is not available at this time.', {
status: 403,
})
}
}
addEventListener('fetch', event => {
event.respondWith(fetchAndApply(event.request))
})
async function fetchAndApply(request) {
let referer = request.headers.get('Referer')
let urlreq = new URL(request.url).hostname
if (request.headers.get('user-agent')) {
if ((request.headers.get('user-agent').includes('googlebot')) || (request.headers.get('user-agent').includes('bingbot')) || (request.headers.get('user-agent').includes('pinterest')) || (request.headers.get('user-agent').includes('facebookfacebookexternalhit')) || (request.headers.get('user-agent').includes('facebook')) || (request.headers.get('user-agent').includes('twitter')) || (request.headers.get('user-agent').includes('GoogleImageProxy')) || (request.headers.get('user-agent').includes('yandex'))) {
return fetch(request)
} else {
if (referer) {
// It's an image and there's a Referer. Verify that the
// hostnames match.
if (new URL(referer).hostname ==
new URL(request.url).hostname) {
return fetch(request)
// Else if its pinterest
// hostnames match.
} else if (new URL(request.url).hostname.indexOf('pinterest')) {
return fetch(request)
// Else if its twiiter
// hostnames match.
} else if (new URL(request.url).hostname.indexOf('twitter')) {
return fetch(request)
// Else if its google
// hostnames match.
} else if (new URL(request.url).hostname.indexOf('google')) {
return fetch(request)
// Else if its bing
// hostnames match.
} else if (new URL(request.url).hostname.indexOf('bing')) {
return fetch(request)
} else {
console.log('referer',referer)
// Hosts don't match. This is a hotlink and its not a friendly search bot or social media
return new Response('Sorry, this image is not available at this time.', {
status: 403,
})
}
}
}
}
else {
console.log('referer',referer)
// No useragent
return new Response('Sorry, this image is not available at this time.', {
status: 403,
})
}
}
most requests do not include a referer so anti-hotlinking measures are no longer the smart moveHow do you get from point A to point B? Blocking hotlinking was never about denying requests with no referer--you’d have to poke holes right and left for every legitimate search engine, for starters. It’s about requests with wrong referers, of which there are still plenty.
You can always block the Cloudflare bot that caches the hotlinked image from your images files:
addEventListener('fetch', event => {
event.respondWith(fetchAndApply(event.request))
})
async function fetchAndApply(request) {
let referer = request.headers.get('Referer')
let urlreq = new URL(request.url).hostname
if (request.headers.get('user-agent')) {
if ((request.headers.get('user-agent').includes('googlebot')) || (request.headers.get('user-agent').includes('applebot')) || (request.headers.get('user-agent').includes('bingbot')) || (request.headers.get('user-agent').includes('pinterest')) || (request.headers.get('user-agent').includes('facebookfacebookexternalhit')) || (request.headers.get('user-agent').includes('facebook')) || (request.headers.get('user-agent').includes('twitter')) || (request.headers.get('user-agent').includes('GoogleImageProxy')) || (request.headers.get('user-agent').includes('yandex'))) {
return fetch(request)
} else {
if (referer) {
if ((new URL(referer).hostname !== new URL(request.url).hostname) && (new URL(request.url).hostname.indexOf('google')=== -1) && (new URL(request.url).hostname.indexOf('apple')=== -1) && (new URL(request.url).hostname.indexOf('bing')=== -1) && (new URL(request.url).hostname.indexOf('twitter')=== -1) && (new URL(request.url).hostname.indexOf('facebook')=== -1) && (new URL(request.url).hostname.indexOf('yandex')=== -1)) {
// Hosts don't match. This is a hotlink and its not a friendly search bot or social media
return new Response('Sorry, this image is not available at this time.... ', {
status: 403,
})
} else {
return fetch(request)
}
// no referer
} else {
console.log('referer',referer)
return new Response('Sorry, this image is not available at the moment.', {
status: 403,
})
// close else
}
}
} else { return new Response('Sorry, this image is not available at the moment.', {
status: 403,
})
}
}
<If "%{HTTP_REFERER} =~ /yourdomain/">
</If>
<Else>
<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif)$">
Header set Cache-Control "private, no-cache, max-age=0"
Header set Pragma "no-cache"
</FilesMatch>
</Else>
Now you just need to check every single App, every Social Media site, every browser, every proxy, every company firewall, every Search Engine thumbnail, every Search Engine image search, every directory screenshot, every translation service, ad infinitum... to see if your images are missing.
addEventListener('fetch', event => {
event.respondWith(fetchAndApply(event.request))
})
async function fetchAndApply(request) {
let referer = request.headers.get('Referer')
let urlreq = new URL(request.url).hostname
let url = new URL(request.url).pathname
let response = await fetch(request)
response = new Response(response.body, response)
if (url.indexOf('/IMAGES/') === -1){
console.log('cookies',url)
response.headers.set("Set-Cookie", "images=true")
return response
}
if (url.startsWith('/IMAGES/')) {
let cookies = request.headers.get('Cookie') || ''
if (cookies.includes("images=true")) {
// Its a user on your site let them through.
return fetch(request)
} else {
if (request.headers.get('user-agent')) {
if ((request.headers.get('user-agent').includes('googlebot')) || (request.headers.get('user-agent').includes('applebot')) || (request.headers.get('user-agent').includes('bingbot')) || (request.headers.get('user-agent').includes('pinterest')) || (request.headers.get('user-agent').includes('facebookfacebookexternalhit')) || (request.headers.get('user-agent').includes('facebook')) || (request.headers.get('user-agent').includes('twitter')) || (request.headers.get('user-agent').includes('GoogleImageProxy')) || (request.headers.get('user-agent').includes('yandex'))) {
return fetch(request)
} else {
if (referer) {
if ((new URL(referer).hostname !== new URL(request.url).hostname) && (new URL(request.url).hostname.indexOf('google')=== -1) && (new URL(request.url).hostname.indexOf('apple')=== -1) && (new URL(request.url).hostname.indexOf('bing')=== -1) && (new URL(request.url).hostname.indexOf('twitter')=== -1) && (new URL(request.url).hostname.indexOf('facebook')=== -1) && (new URL(request.url).hostname.indexOf('yandex')=== -1)) {
// Hosts don't match. This is a hotlink and its not a friendly search bot or social media
console.log('referer',url)
return new Response('Sorry, this image is not available at this time.... ', {
status: 403,
})
} else {
return fetch(request)
}
// no referer
} else {
console.log('referer',url)
return new Response('Sorry, this image is not available at the moment.', {
status: 403,
})
// close else
}
}
} else { return new Response('Sorry, this image is not available at the moment.', {
status: 403,
})
}
}
} else { return fetch(request)
}
}
<If "%{HTTP_REFERER} =~ /yourdomain/">
</If>
<Else>
<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif)$">
Header set Cache-Control "private, no-cache, max-age=0"
Header set Pragma "no-cache"
</FilesMatch>
</Else>
if ((new URL(referer).hostname !== new URL(request.url).hostname) ......
// Hosts don't match. This is a hotlink ......
return new Response('Sorry, this image is not available at this time.... ', {
status: 403,
})
[edited by: not2easy at 12:34 am (utc) on Jul 26, 2018]
[edit reason] See ToS #12 [/edit]