Intégration legacy de Cloudflare Workers
Cette page de documentation concerne la version dépréciée de notre intégration Cloudflare Workers et est conservée à des fins d'archivage. En particulier, cette version legacy ne peut pas exécuter les triggers et actions avancés, et ne supporte pas les paramètres associés aux règles. Nous vous conseillons vivement d'utiliser plutôt la version actuelle de notre intégration Cloudflare Worker.
Cette version a été dépréciée le 2 septembre 2020
Afin d'utiliser l'intégration legacy de redirection.io avec Cloudflare Workers :
- créez un compte redirection.io ;
- créez une organisation et un projet redirection.io. À cette étape, vous voudrez peut-être inviter vos collaborateurs ;
- rendez-vous sur l'écran "instances" de votre projet et localisez votre "clé de projet" en cliquant sur "Configurer sur votre infrastructure"
connectez-vous à votre compte Cloudflare, puis cliquez sur le menu "Workers" et appuyez sur le bouton "Lancer l'éditeur" ; dans la partie gauche de l'éditeur, collez notre code Cloudflare Worker redirection.io, et remplacez le jeton de projet par votre propre valeur ;- appuyez sur le bouton "Enregistrer" en bas de l'éditeur ;
dans l'onglet "Routes", activez ce Cloudflare Worker pour l'ensemble de votre site web.
Une fois toutes ces étapes terminées, vous devriez commencer à voir les journaux de trafic dans votre manager redirection.io. Vous êtes prêt :-)
Code du worker Cloudflare redirection.io legacy
Cette section de documentation concerne la version dépréciée de notre intégration Cloudflare Workers et est conservée à des fins d'archivage. En particulier, cette version dépréciée ne peut pas exécuter les déclencheurs et actions avancés. Nous vous conseillons vivement d'utiliser plutôt la version actuelle de notre intégration Cloudflare Worker.
addEventListener('fetch', event => {
event.respondWith(redirectAndLog(event.request))
})
const options = {
token: 'PASTE YOUR PROJECT TOKEN HERE',
timeout: 2000,
}
async function redirectAndLog(request) {
const [response, ruleId] = await redirectOrPass(request)
log(request, response, ruleId)
return response
}
async function redirectOrPass(request) {
const urlObject = new URL(request.url)
const context = {
host: urlObject.host,
request_uri: urlObject.pathname + urlObject.search,
user_agent: request.headers.get('user-agent'),
referer: request.headers.get('referer'),
scheme: urlObject.protocol.includes('https') ? 'https' : 'http',
use_json: true,
}
let response
try {
response = await Promise.race([
fetch('https://proxy.redirection.io/' + options.token + '/get', {
method: 'POST',
body: JSON.stringify(context),
headers: {
'User-Agent': 'cloudflare-service-worker/0.0.1'
},
}),
new Promise((_, reject) =>
setTimeout(() => reject(new Error('Timeout')), options.timeout)
),
])
} catch (error) {
return [await fetch(request), null]
}
const data = await response.text()
try {
response = JSON.parse(data)
} catch (error) {
// If some errors play regular request, anyway request will be in error when no redirection (404)
return [await fetch(request), null]
}
// Send gone response
if (response.status_code === 410) {
return [new Response('', { status: 410 }), response.matched_rule.id]
}
// Send redirection response
return [new Response('', {
status: Number(response.status_code),
headers: {
Location: response.location,
},
}),
response.matched_rule.id]
}
async function log(request, response, ruleId) {
const urlObject = new URL(request.url)
const context = {
status_code: response.status,
host: urlObject.host,
method: request.method,
request_uri: urlObject.pathname + urlObject.search,
user_agent: request.headers.get('user-agent'),
referer: request.headers.get('referer'),
scheme: urlObject.protocol.includes('https') ? 'https' : 'http',
use_json: true,
}
if (response.headers.get('Location')) {
context.target = response.headers.get('Location');
}
if (ruleId) {
context.rule_id = ruleId;
}
try {
return await fetch(
'https://proxy.redirection.io/' + options.token + '/log',
{
method: 'POST',
body: JSON.stringify(context),
headers: {
'User-Agent': 'cloudflare-service-worker/0.0.1'
},
}
)
} catch (error) {
// Do nothing, do not matters if some logs are in errors
console.log('could not log')
console.log(error)
}
}