feat(lang): routage préfixé /fr/ et /en/ avec redirect JS langue sur les chemins non préfixés
- page-redirect sur / et tous les chemins sans préfixe : localStorage zektyc-lang puis navigator.language, défaut fr ; fallback FR si la page n'a pas de version EN - /en/ sert enfin la home EN (public/en/), fix de LANG_ROUTES.en - home EN générée à partir d'i18n.json (ld+json Organization/FAQPage valides) - i18n.js/components.js : switch de langue par préfixe + liens préfixés - anciennes URLs /zmap/en/* : 301 vers /en/zmap/* ; pages EN zmap déplacées vers le layout <page>/en/ standard - canonicals/hreflang fr-en-x-default sur toutes les pages statiques + sitemaps (équipe, zmap, archives, vitesses-par-route ajoutées) ; suppression du domaine obsolète zektyc.duckdns.org (robots, sitemap index, security.txt)
This commit is contained in:
parent
bf9b3ccf69
commit
370b3d8752
30 changed files with 566 additions and 124 deletions
|
|
@ -2,5 +2,5 @@
|
|||
Contact: mailto:riric65@protonmail.com
|
||||
Expires: 2027-02-14T00:00:00.000Z
|
||||
Preferred-Languages: fr, en
|
||||
Canonical: https://zektyc.duckdns.org/.well-known/security.txt
|
||||
Policy: https://zektyc.duckdns.org/tos
|
||||
Canonical: https://riricdev.tail5ea5cd.ts.net/.well-known/security.txt
|
||||
Policy: https://riricdev.tail5ea5cd.ts.net/fr/tos
|
||||
|
|
|
|||
|
|
@ -7,6 +7,9 @@
|
|||
<meta name="robots" content="index, follow" />
|
||||
<title>Blog · Zektyc</title>
|
||||
<link rel="canonical" href="https://riricdev.tail5ea5cd.ts.net/en/blog/" />
|
||||
<link rel="alternate" hreflang="fr" href="https://riricdev.tail5ea5cd.ts.net/fr/blog/" />
|
||||
<link rel="alternate" hreflang="en" href="https://riricdev.tail5ea5cd.ts.net/en/blog/" />
|
||||
<link rel="alternate" hreflang="x-default" href="https://riricdev.tail5ea5cd.ts.net/fr/blog/" />
|
||||
<meta name="theme-color" content="#070a0f" />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:site_name" content="Zektyc" />
|
||||
|
|
|
|||
|
|
@ -6,13 +6,16 @@
|
|||
<meta name="description" content="Blog Zektyc — articles sur la vie privée, la sécurité, le développement et le self-hosting." />
|
||||
<meta name="robots" content="index, follow" />
|
||||
<title>Blog · Zektyc</title>
|
||||
<link rel="canonical" href="https://riricdev.tail5ea5cd.ts.net/blog/" />
|
||||
<link rel="canonical" href="https://riricdev.tail5ea5cd.ts.net/fr/blog/" />
|
||||
<link rel="alternate" hreflang="fr" href="https://riricdev.tail5ea5cd.ts.net/fr/blog/" />
|
||||
<link rel="alternate" hreflang="en" href="https://riricdev.tail5ea5cd.ts.net/en/blog/" />
|
||||
<link rel="alternate" hreflang="x-default" href="https://riricdev.tail5ea5cd.ts.net/fr/blog/" />
|
||||
<meta name="theme-color" content="#070a0f" />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:site_name" content="Zektyc" />
|
||||
<meta property="og:title" content="Blog · Zektyc" />
|
||||
<meta property="og:description" content="Blog Zektyc — articles sur la vie privée, la sécurité, le développement et le self-hosting." />
|
||||
<meta property="og:url" content="https://riricdev.tail5ea5cd.ts.net/blog/" />
|
||||
<meta property="og:url" content="https://riricdev.tail5ea5cd.ts.net/fr/blog/" />
|
||||
<meta property="og:image" content="https://riricdev.tail5ea5cd.ts.net/og-image.png" />
|
||||
<meta property="og:locale" content="fr_FR" />
|
||||
<meta property="og:locale:alternate" content="en_US" />
|
||||
|
|
|
|||
266
public/en/index.html
Normal file
266
public/en/index.html
Normal file
|
|
@ -0,0 +1,266 @@
|
|||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<meta
|
||||
name="description"
|
||||
content="Zektyc fights for privacy and security, from France. No jargon, no panic."
|
||||
/>
|
||||
<meta name="robots" content="index, follow" />
|
||||
<meta name="google-site-verification" content="N1b0LZMSAZtyfp-g71v7YRCQuEErtqCWp7bcGDZ_Frw" />
|
||||
<title>Zektyc — Privacy and security, from France</title>
|
||||
<link rel="canonical" href="https://riricdev.tail5ea5cd.ts.net/en/" />
|
||||
<meta name="theme-color" content="#070a0f" />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:site_name" content="Zektyc" />
|
||||
<meta
|
||||
property="og:title"
|
||||
content="Zektyc — Privacy and security, from France"
|
||||
/>
|
||||
<meta
|
||||
property="og:description"
|
||||
content="Zektyc fights for privacy and security, from France. No jargon, no panic."
|
||||
/>
|
||||
<meta property="og:url" content="https://riricdev.tail5ea5cd.ts.net/en/" />
|
||||
<meta property="og:image" content="https://riricdev.tail5ea5cd.ts.net/og-image.png" />
|
||||
<meta property="og:locale" content="en_US" />
|
||||
<meta property="og:locale:alternate" content="fr_FR" />
|
||||
<link rel="alternate" hreflang="fr" href="https://riricdev.tail5ea5cd.ts.net/fr/" />
|
||||
<link rel="alternate" hreflang="en" href="https://riricdev.tail5ea5cd.ts.net/en/" />
|
||||
<link rel="alternate" hreflang="x-default" href="https://riricdev.tail5ea5cd.ts.net/fr/" />
|
||||
<meta name="twitter:card" content="summary_large_image" />
|
||||
<meta name="twitter:image" content="https://riricdev.tail5ea5cd.ts.net/og-image.png" />
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "Organization",
|
||||
"name": "Zektyc",
|
||||
"url": "https://riricdev.tail5ea5cd.ts.net/",
|
||||
"logo": "https://riricdev.tail5ea5cd.ts.net/favicon.svg",
|
||||
"email": "riric65@protonmail.com",
|
||||
"address": { "@type": "PostalAddress", "addressCountry": "FR" },
|
||||
"sameAs": ["https://discord.gg/mAXeNf7zUV"]
|
||||
}
|
||||
</script>
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "FAQPage",
|
||||
"mainEntity": [
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "Does this website collect my data?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "No. Zektyc intentionally collects nothing: no account, no form, no cookie, no tracker, no analytics and no share buttons. The only data processed is automatic technical logging (IP address, date and time, requested resource), kept for fourteen days maximum for security purposes, then automatically deleted. Our privacy policy details all of these processing activities."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "Why are there no cookies on this website?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "Because tracking is never necessary for an informational website: it only serves to profile visitors and resell their data. Without cookies, there is no tracking, no targeted advertising and no consent to extort. It is our way of practising what we preach: privacy is not a luxury, it is a fundamental right, and it starts with technical sobriety."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "Is online privacy really for everyone?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "Yes, and that is precisely why Zektyc exists. Security is not reserved for experts: everyone can make simple, effective choices, such as using a privacy-friendly browser, choosing strong passwords, enabling two-factor authentication and letting a password manager handle the rest. Our job is to help you put these protections in place without jargon and without scaring you."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "What does Zektyc actually do?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "We help people take back control of their data, calmly. We explain real threats simply, without panic or sensationalism, we recommend concrete protections that are tested and easy to adopt, and we put privacy and security back at the centre of technical decisions. We are based in France, independent and human, and we practise what we advise."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "Is the website secure?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "Yes. The website is only reachable over HTTPS, with restrictive security headers, rate limiting per IP address and blocking of sensitive paths. If you find a flaw, you can report it through our responsible disclosure policy, published in the standard /.well-known/security.txt file, without legal risk as long as you respect our reporting conditions."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "What do you do with the messages I send you?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "Your messages are used solely to answer your request. They are never shared, never used for marketing and not kept beyond the time needed for the exchange. Messages transit through our messaging providers (Proton Mail, Signal, Discord), which process them only to deliver them; Signal encrypts your exchanges end to end."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "How can I contact you?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "By e-mail at riric65@protonmail.com, by Signal at the username notriric.05, or through our official Discord server. For any sensitive or confidential communication, prefer e-mail or Signal over Discord, as these channels respect your privacy more. We reply within a reasonable time, without canned phrases."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "Is this website free?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "Yes. Browsing the website is entirely free and will remain so. We do not sell your data, we display no advertising and we claim nothing but your trust. If we ever offer paid services, they will be clearly presented and kept separate from the free information we publish."
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
</script>
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg?v=1" />
|
||||
<link rel="shortcut icon" href="/favicon.ico" />
|
||||
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
|
||||
<link rel="me" href="https://piaille.fr/@zektyc" />
|
||||
<link rel="stylesheet" href="/css/style.css?v=8" />
|
||||
<script src="/js/theme.js" defer></script>
|
||||
<script src="/js/components.js?v=6" defer></script>
|
||||
<script src="/js/i18n.js?v=3" defer></script>
|
||||
<script src="/js/discord.js?v=1" defer></script>
|
||||
</head>
|
||||
<body>
|
||||
<header id="h"></header>
|
||||
|
||||
<main class="site-main" id="main">
|
||||
<section class="hero">
|
||||
<p class="hero-badge" data-i18n="hero.badge">Based in France · Independent</p>
|
||||
<h1>
|
||||
<span data-i18n="hero.title1">Privacy is not a luxury.</span><br />
|
||||
<span data-i18n="hero.title2">Neither is security.</span>
|
||||
</h1>
|
||||
<p class="hero-sub" data-i18n="hero.sub">Zektyc helps people take back control of their data, calmly. We fight for privacy and security — no jargon, no panic.</p>
|
||||
<div class="hero-actions">
|
||||
<a class="btn btn-primary" href="#contact" data-i18n="hero.cta.contact">Let's talk</a>
|
||||
<a class="btn btn-ghost" href="#principes" data-i18n="hero.cta.principes">See our principles</a>
|
||||
<a class="btn btn-ghost" rel="me" href="https://piaille.fr/@zektyc">
|
||||
<img src="/icons/mastodon.svg" alt="" width="18" height="18" aria-hidden="true" class="footer-icon" />
|
||||
Mastodon
|
||||
</a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="manifesto">
|
||||
<h2 data-i18n="manifesto.title">Why we do this</h2>
|
||||
<p data-i18n="manifesto.text">Surveillance is everywhere. Every click is tracked, every message analyzed, every bit of data resold. Privacy is not a luxury: it's a condition of freedom. We believe your data should belong to you — to you, and no one else. We explain, we take the drama out of it, and we hand you concrete tools to take back control, from a simple browser to a personal server. No jargon, no panic: our job is to set things straight.</p>
|
||||
</section>
|
||||
|
||||
<section id="projets" class="projects">
|
||||
<h2 data-i18n="projects.title">Our projects</h2>
|
||||
<p class="projects-intro" data-i18n="projects.intro">We don't just talk about protection, we put it into practice. Every project is self-hosted and collects no data.</p>
|
||||
<div class="grid-cards">
|
||||
<article class="card">
|
||||
<h3>Fingerprint Test</h3>
|
||||
<p data-i18n="projects.fp.text">Find out how identifiable your browser makes you, with a score and explanations. Everything is computed locally, nothing is sent or stored.</p>
|
||||
<a class="btn btn-ghost" href="/fingerprint-test" data-lang-path="/fingerprint-test" data-i18n="projects.fp.cta">Test my fingerprint</a>
|
||||
</article>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="principes" class="values">
|
||||
<h2 data-i18n="values.title">Our principles</h2>
|
||||
<div class="grid-cards">
|
||||
<article class="card">
|
||||
<h3 data-i18n="values.priv.title">Privacy</h3>
|
||||
<p data-i18n="values.priv.text">Your data stays yours, period. We stand against trackers, surveillance and mass data collection.</p>
|
||||
</article>
|
||||
<article class="card">
|
||||
<h3 data-i18n="values.sec.title">Security</h3>
|
||||
<p data-i18n="values.sec.text">Concrete protections, tested and explained simply. Because security is for everyone, not just the experts.</p>
|
||||
</article>
|
||||
<article class="card">
|
||||
<h3 data-i18n="values.trans.title">Transparency</h3>
|
||||
<p data-i18n="values.trans.text">We do what we say, and we say what we do. No vague promises, no black magic.</p>
|
||||
</article>
|
||||
<article class="card">
|
||||
<h3 data-i18n="values.fr.title">Made in France</h3>
|
||||
<p data-i18n="values.fr.text">We're based in France and proud of it. Local, independent, human.</p>
|
||||
</article>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="tor-banner">
|
||||
<p>
|
||||
<strong>Disponible sur Tor</strong> ·
|
||||
<code>l5cbkqmok4rnkhbtpltmtlf3pa5i5rfw23z2mtj5tugpo3quta3b5hqd.onion</code>
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section id="faq" class="faq">
|
||||
<h2 data-i18n="faq.title">Frequently asked questions</h2>
|
||||
<p class="faq-intro" data-i18n="faq.intro">A few questions we get asked a lot, with clear answers. The basic principle: no collection, no tracking, no compromise.</p>
|
||||
<div class="faq-list">
|
||||
<article class="faq-item">
|
||||
<h3 data-i18n="faq.q1">Does this website collect my data?</h3>
|
||||
<p data-i18n="faq.a1">No. Zektyc intentionally collects nothing: no account, no form, no cookie, no tracker, no analytics and no share buttons. The only data processed is automatic technical logging (IP address, date and time, requested resource), kept for fourteen days maximum for security purposes, then automatically deleted. Our privacy policy details all of these processing activities.</p>
|
||||
</article>
|
||||
<article class="faq-item">
|
||||
<h3 data-i18n="faq.q2">Why are there no cookies on this website?</h3>
|
||||
<p data-i18n="faq.a2">Because tracking is never necessary for an informational website: it only serves to profile visitors and resell their data. Without cookies, there is no tracking, no targeted advertising and no consent to extort. It is our way of practising what we preach: privacy is not a luxury, it is a fundamental right, and it starts with technical sobriety.</p>
|
||||
</article>
|
||||
<article class="faq-item">
|
||||
<h3 data-i18n="faq.q3">Is online privacy really for everyone?</h3>
|
||||
<p data-i18n="faq.a3">Yes, and that is precisely why Zektyc exists. Security is not reserved for experts: everyone can make simple, effective choices, such as using a privacy-friendly browser, choosing strong passwords, enabling two-factor authentication and letting a password manager handle the rest. Our job is to help you put these protections in place without jargon and without scaring you.</p>
|
||||
</article>
|
||||
<article class="faq-item">
|
||||
<h3 data-i18n="faq.q4">What does Zektyc actually do?</h3>
|
||||
<p data-i18n="faq.a4">We help people take back control of their data, calmly. We explain real threats simply, without panic or sensationalism, we recommend concrete protections that are tested and easy to adopt, and we put privacy and security back at the centre of technical decisions. We are based in France, independent and human, and we practise what we advise.</p>
|
||||
</article>
|
||||
<article class="faq-item">
|
||||
<h3 data-i18n="faq.q5">Is the website secure?</h3>
|
||||
<p data-i18n="faq.a5">Yes. The website is only reachable over HTTPS, with restrictive security headers, rate limiting per IP address and blocking of sensitive paths. If you find a flaw, you can report it through our responsible disclosure policy, published in the standard /.well-known/security.txt file, without legal risk as long as you respect our reporting conditions.</p>
|
||||
</article>
|
||||
<article class="faq-item">
|
||||
<h3 data-i18n="faq.q6">What do you do with the messages I send you?</h3>
|
||||
<p data-i18n="faq.a6">Your messages are used solely to answer your request. They are never shared, never used for marketing and not kept beyond the time needed for the exchange. Messages transit through our messaging providers (Proton Mail, Signal, Discord), which process them only to deliver them; Signal encrypts your exchanges end to end.</p>
|
||||
</article>
|
||||
<article class="faq-item">
|
||||
<h3 data-i18n="faq.q7">How can I contact you?</h3>
|
||||
<p data-i18n="faq.a7">By e-mail at riric65@protonmail.com, by Signal at the username notriric.05, or through our official Discord server. For any sensitive or confidential communication, prefer e-mail or Signal over Discord, as these channels respect your privacy more. We reply within a reasonable time, without canned phrases.</p>
|
||||
</article>
|
||||
<article class="faq-item">
|
||||
<h3 data-i18n="faq.q8">Is this website free?</h3>
|
||||
<p data-i18n="faq.a8">Yes. Browsing the website is entirely free and will remain so. We do not sell your data, we display no advertising and we claim nothing but your trust. If we ever offer paid services, they will be clearly presented and kept separate from the free information we publish.</p>
|
||||
</article>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="contact" class="contact">
|
||||
<h2 data-i18n="contact.title">Want to talk?</h2>
|
||||
<p data-i18n="contact.text">A project, a question, a concern? Drop us a line — we're happy to answer, without canned phrases.</p>
|
||||
<div class="contact-list">
|
||||
<div class="contact-item">
|
||||
<span class="contact-label" data-i18n="contact.signal">Signal</span>
|
||||
<span class="contact-value">notriric.05</span>
|
||||
</div>
|
||||
<div class="contact-item">
|
||||
<span class="contact-label" data-i18n="contact.discord">Discord</span>
|
||||
<a
|
||||
class="contact-value"
|
||||
href="https://discord.gg/mAXeNf7zUV"
|
||||
target="_blank"
|
||||
rel="noopener"
|
||||
>discord.gg/mAXeNf7zUV</a
|
||||
>
|
||||
<span id="discord-presence" class="contact-badge"></span>
|
||||
</div>
|
||||
<div class="contact-item">
|
||||
<span class="contact-label" data-i18n="contact.email">Email</span>
|
||||
<a class="contact-value" href="mailto:riric65@protonmail.com"
|
||||
>riric65@protonmail.com</a
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
<footer id="f"></footer>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -7,6 +7,9 @@
|
|||
<meta name="robots" content="index, follow" />
|
||||
<title>Team · Zektyc</title>
|
||||
<link rel="canonical" href="https://riricdev.tail5ea5cd.ts.net/en/equipe/" />
|
||||
<link rel="alternate" hreflang="fr" href="https://riricdev.tail5ea5cd.ts.net/fr/equipe/" />
|
||||
<link rel="alternate" hreflang="en" href="https://riricdev.tail5ea5cd.ts.net/en/equipe/" />
|
||||
<link rel="alternate" hreflang="x-default" href="https://riricdev.tail5ea5cd.ts.net/fr/equipe/" />
|
||||
<meta name="theme-color" content="#070a0f" />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:site_name" content="Zektyc" />
|
||||
|
|
|
|||
|
|
@ -6,13 +6,16 @@
|
|||
<meta name="description" content="L'équipe derrière Zektyc — Riric, fondateur et architecte, et OpenCode, programmeur." />
|
||||
<meta name="robots" content="index, follow" />
|
||||
<title>Équipe · Zektyc</title>
|
||||
<link rel="canonical" href="https://riricdev.tail5ea5cd.ts.net/equipe/" />
|
||||
<link rel="canonical" href="https://riricdev.tail5ea5cd.ts.net/fr/equipe/" />
|
||||
<link rel="alternate" hreflang="fr" href="https://riricdev.tail5ea5cd.ts.net/fr/equipe/" />
|
||||
<link rel="alternate" hreflang="en" href="https://riricdev.tail5ea5cd.ts.net/en/equipe/" />
|
||||
<link rel="alternate" hreflang="x-default" href="https://riricdev.tail5ea5cd.ts.net/fr/equipe/" />
|
||||
<meta name="theme-color" content="#070a0f" />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:site_name" content="Zektyc" />
|
||||
<meta property="og:title" content="Équipe · Zektyc" />
|
||||
<meta property="og:description" content="L'équipe derrière Zektyc — Riric, fondateur et architecte, et OpenCode, programmeur." />
|
||||
<meta property="og:url" content="https://riricdev.tail5ea5cd.ts.net/equipe/" />
|
||||
<meta property="og:url" content="https://riricdev.tail5ea5cd.ts.net/fr/equipe/" />
|
||||
<meta property="og:image" content="https://riricdev.tail5ea5cd.ts.net/og-image.png" />
|
||||
<meta property="og:locale" content="fr_FR" />
|
||||
<meta property="og:locale:alternate" content="en_US" />
|
||||
|
|
|
|||
|
|
@ -10,6 +10,9 @@
|
|||
<meta name="robots" content="index, follow" />
|
||||
<title>Browser Fingerprint Test · Zektyc</title>
|
||||
<link rel="canonical" href="https://riricdev.tail5ea5cd.ts.net/en/fingerprint-test" />
|
||||
<link rel="alternate" hreflang="fr" href="https://riricdev.tail5ea5cd.ts.net/fr/fingerprint-test" />
|
||||
<link rel="alternate" hreflang="en" href="https://riricdev.tail5ea5cd.ts.net/en/fingerprint-test" />
|
||||
<link rel="alternate" hreflang="x-default" href="https://riricdev.tail5ea5cd.ts.net/fr/fingerprint-test" />
|
||||
<meta name="theme-color" content="#070a0f" />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:site_name" content="Zektyc" />
|
||||
|
|
|
|||
|
|
@ -10,6 +10,9 @@
|
|||
<meta name="robots" content="index, follow" />
|
||||
<title>Test d'empreinte numérique · Zektyc</title>
|
||||
<link rel="canonical" href="https://riricdev.tail5ea5cd.ts.net/fr/fingerprint-test" />
|
||||
<link rel="alternate" hreflang="fr" href="https://riricdev.tail5ea5cd.ts.net/fr/fingerprint-test" />
|
||||
<link rel="alternate" hreflang="en" href="https://riricdev.tail5ea5cd.ts.net/en/fingerprint-test" />
|
||||
<link rel="alternate" hreflang="x-default" href="https://riricdev.tail5ea5cd.ts.net/fr/fingerprint-test" />
|
||||
<meta name="theme-color" content="#070a0f" />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:site_name" content="Zektyc" />
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@
|
|||
<meta name="robots" content="index, follow" />
|
||||
<meta name="google-site-verification" content="N1b0LZMSAZtyfp-g71v7YRCQuEErtqCWp7bcGDZ_Frw" />
|
||||
<title>Zektyc — Vie privée et sécurité, depuis la France</title>
|
||||
<link rel="canonical" href="https://riricdev.tail5ea5cd.ts.net/" />
|
||||
<link rel="canonical" href="https://riricdev.tail5ea5cd.ts.net/fr/" />
|
||||
<meta name="theme-color" content="#070a0f" />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:site_name" content="Zektyc" />
|
||||
|
|
@ -22,13 +22,13 @@
|
|||
property="og:description"
|
||||
content="Zektyc défend la vie privée et la sécurité, depuis la France. Sans jargon, sans panique."
|
||||
/>
|
||||
<meta property="og:url" content="https://riricdev.tail5ea5cd.ts.net/" />
|
||||
<meta property="og:url" content="https://riricdev.tail5ea5cd.ts.net/fr/" />
|
||||
<meta property="og:image" content="https://riricdev.tail5ea5cd.ts.net/og-image.png" />
|
||||
<meta property="og:locale" content="fr_FR" />
|
||||
<meta property="og:locale:alternate" content="en_US" />
|
||||
<link rel="alternate" hreflang="fr" href="https://riricdev.tail5ea5cd.ts.net/" />
|
||||
<link rel="alternate" hreflang="fr" href="https://riricdev.tail5ea5cd.ts.net/fr/" />
|
||||
<link rel="alternate" hreflang="en" href="https://riricdev.tail5ea5cd.ts.net/en/" />
|
||||
<link rel="alternate" hreflang="x-default" href="https://riricdev.tail5ea5cd.ts.net/" />
|
||||
<link rel="alternate" hreflang="x-default" href="https://riricdev.tail5ea5cd.ts.net/fr/" />
|
||||
<meta name="twitter:card" content="summary_large_image" />
|
||||
<meta name="twitter:image" content="https://riricdev.tail5ea5cd.ts.net/og-image.png" />
|
||||
<script type="application/ld+json">
|
||||
|
|
|
|||
|
|
@ -9,28 +9,14 @@
|
|||
|
||||
function path() { return location.pathname; }
|
||||
function lang() { return /^\/en(\/|$)/.test(path()) ? 'en' : 'fr'; }
|
||||
function isHome() { var p = path(); return p === '/' || p === '/index.html' || p === '/en/' || p === '/en/index.html'; }
|
||||
|
||||
function frLink() {
|
||||
var p = path();
|
||||
if (p === '/en/') return '/';
|
||||
var m = p.match(/^(\/[^/]+)\/en\/?$/);
|
||||
if (m) return m[1] + '/';
|
||||
return p;
|
||||
}
|
||||
|
||||
function enLink() {
|
||||
var p = path();
|
||||
if (p === '/' || p === '/index.html') return '/en/';
|
||||
if (/\/en\/?$/.test(p)) return p;
|
||||
return p.replace(/\/?$/, '/en/');
|
||||
}
|
||||
function isHome() { var p = path(); return p === '/' || p === '/index.html' || p === '/fr/' || p === '/fr/index.html' || p === '/en/' || p === '/en/index.html'; }
|
||||
|
||||
function buildHeader() {
|
||||
var h = lang();
|
||||
var l = h === 'fr' ? '/fr' : '/en';
|
||||
var skip = h === 'fr' ? 'Aller au contenu' : 'Skip to content';
|
||||
var html = '<a class="skip-link" href="#main">' + skip + '</a>';
|
||||
html += '<a class="brand" href="/">' + BRAND + '</a>';
|
||||
html += '<a class="brand" href="' + (h === 'fr' ? '/fr/' : '/en/') + '">' + BRAND + '</a>';
|
||||
html += '<input type="checkbox" id="nav-toggle" class="nav-toggle-input" />';
|
||||
html += '<label for="nav-toggle" class="nav-burger" aria-label="Menu">';
|
||||
html += '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><path d="M4 6h16M4 12h16M4 18h16"/></svg>';
|
||||
|
|
@ -39,9 +25,9 @@
|
|||
|
||||
html += '<nav class="site-nav" aria-label="Navigation">';
|
||||
|
||||
html += '<a href="/blog" data-lang-path="/blog" data-i18n="nav.blog">Blog</a>';
|
||||
html += '<a href="/projets" data-lang-path="/projets" data-i18n="nav.projects">Projets</a>';
|
||||
html += '<a href="/equipe" data-lang-path="/equipe" data-i18n="nav.team">\u00c9quipe</a>';
|
||||
html += '<a href="' + l + '/blog" data-lang-path="/blog" data-i18n="nav.blog">Blog</a>';
|
||||
html += '<a href="' + l + '/projets" data-lang-path="/projets" data-i18n="nav.projects">Projets</a>';
|
||||
html += '<a href="' + l + '/equipe" data-lang-path="/equipe" data-i18n="nav.team">\u00c9quipe</a>';
|
||||
if (isHome()) {
|
||||
html += '<a href="#principes" data-i18n="nav.principes">Nos principes</a>';
|
||||
html += '<a href="#faq" data-i18n="nav.faq">FAQ</a>';
|
||||
|
|
@ -63,8 +49,8 @@
|
|||
var tos = h === 'fr' ? "Conditions d\u2019utilisation" : 'Terms of Service';
|
||||
var priv = h === 'fr' ? 'Confidentialit\u00e9' : 'Privacy';
|
||||
var note = h === 'fr' ? 'Ce site ne collecte rien. Aucun cookie, aucun tracker.' : 'This site collects nothing. No cookies, no trackers.';
|
||||
var tosHref = h === 'fr' ? '/tos' : '/en/tos';
|
||||
var privHref = h === 'fr' ? '/privacy-policy' : '/en/privacy-policy';
|
||||
var tosHref = h === 'fr' ? '/fr/tos' : '/en/tos';
|
||||
var privHref = h === 'fr' ? '/fr/privacy-policy' : '/en/privacy-policy';
|
||||
|
||||
var html = '';
|
||||
html += '<p>Zektyc \u00b7 France</p>';
|
||||
|
|
|
|||
|
|
@ -113,18 +113,13 @@
|
|||
try {
|
||||
localStorage.setItem(STORAGE_KEY, lang)
|
||||
} catch (err) {}
|
||||
apply(lang)
|
||||
|
||||
var currentPath = window.location.pathname
|
||||
var isHome = currentPath === "/" || currentPath === "/index.html" || currentPath === "/en/" || currentPath === "/en/index.html"
|
||||
if (isHome) {
|
||||
var newUrl = lang === "fr" ? "/" : "/en/"
|
||||
if (currentPath !== newUrl) history.pushState(null, "", newUrl)
|
||||
return
|
||||
var target = currentPath
|
||||
if (/^\/fr(\/|$)/.test(currentPath) || /^\/en(\/|$)/.test(currentPath)) {
|
||||
target = "".concat("/", lang, currentPath.slice(3))
|
||||
}
|
||||
|
||||
var target = "/" + lang + "/" + (window.location.hash || "")
|
||||
if (window.location.pathname !== "/" + lang + "/") {
|
||||
if (window.location.pathname !== target) {
|
||||
window.location.href = target
|
||||
}
|
||||
})
|
||||
|
|
|
|||
|
|
@ -9,6 +9,11 @@
|
|||
/>
|
||||
<meta name="robots" content="index, follow" />
|
||||
<title>Privacy Policy · Zektyc</title>
|
||||
|
||||
<link rel="canonical" href="https://riricdev.tail5ea5cd.ts.net/en/privacy-policy" />
|
||||
<link rel="alternate" hreflang="fr" href="https://riricdev.tail5ea5cd.ts.net/fr/privacy-policy" />
|
||||
<link rel="alternate" hreflang="en" href="https://riricdev.tail5ea5cd.ts.net/en/privacy-policy" />
|
||||
<link rel="alternate" hreflang="x-default" href="https://riricdev.tail5ea5cd.ts.net/fr/privacy-policy" />
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
||||
<link rel="shortcut icon" href="/favicon.ico" />
|
||||
<link rel="stylesheet" href="/css/style.css?v=8" />
|
||||
|
|
|
|||
|
|
@ -9,6 +9,11 @@
|
|||
/>
|
||||
<meta name="robots" content="index, follow" />
|
||||
<title>Politique de confidentialité · Zektyc</title>
|
||||
|
||||
<link rel="canonical" href="https://riricdev.tail5ea5cd.ts.net/fr/privacy-policy" />
|
||||
<link rel="alternate" hreflang="fr" href="https://riricdev.tail5ea5cd.ts.net/fr/privacy-policy" />
|
||||
<link rel="alternate" hreflang="en" href="https://riricdev.tail5ea5cd.ts.net/en/privacy-policy" />
|
||||
<link rel="alternate" hreflang="x-default" href="https://riricdev.tail5ea5cd.ts.net/fr/privacy-policy" />
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
||||
<link rel="shortcut icon" href="/favicon.ico" />
|
||||
<link rel="stylesheet" href="/css/style.css?v=8" />
|
||||
|
|
|
|||
|
|
@ -6,13 +6,16 @@
|
|||
<meta name="description" content="Projects built or contributed to by Zektyc: fingerprint testing, pentesting, open source tools." />
|
||||
<meta name="robots" content="index, follow" />
|
||||
<title>Projects · Zektyc</title>
|
||||
<link rel="canonical" href="https://riricdev.tail5ea5cd.ts.net/projets/en/" />
|
||||
<link rel="canonical" href="https://riricdev.tail5ea5cd.ts.net/en/projets/" />
|
||||
<link rel="alternate" hreflang="fr" href="https://riricdev.tail5ea5cd.ts.net/fr/projets/" />
|
||||
<link rel="alternate" hreflang="en" href="https://riricdev.tail5ea5cd.ts.net/en/projets/" />
|
||||
<link rel="alternate" hreflang="x-default" href="https://riricdev.tail5ea5cd.ts.net/fr/projets/" />
|
||||
<meta name="theme-color" content="#070a0f" />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:site_name" content="Zektyc" />
|
||||
<meta property="og:title" content="Projects · Zektyc" />
|
||||
<meta property="og:description" content="Projects built or contributed to by Zektyc: fingerprint testing, pentesting, open source tools." />
|
||||
<meta property="og:url" content="https://riricdev.tail5ea5cd.ts.net/projets/en/" />
|
||||
<meta property="og:url" content="https://riricdev.tail5ea5cd.ts.net/en/projets/" />
|
||||
<meta property="og:image" content="https://riricdev.tail5ea5cd.ts.net/og-image.png" />
|
||||
<meta property="og:locale" content="en_US" />
|
||||
<meta property="og:locale:alternate" content="fr_FR" />
|
||||
|
|
|
|||
|
|
@ -6,13 +6,16 @@
|
|||
<meta name="description" content="Projets réalisés ou contribués par Zektyc : test d'empreinte digitale, pentest, outils open source." />
|
||||
<meta name="robots" content="index, follow" />
|
||||
<title>Projets · Zektyc</title>
|
||||
<link rel="canonical" href="https://riricdev.tail5ea5cd.ts.net/projets/" />
|
||||
<link rel="canonical" href="https://riricdev.tail5ea5cd.ts.net/fr/projets/" />
|
||||
<link rel="alternate" hreflang="fr" href="https://riricdev.tail5ea5cd.ts.net/fr/projets/" />
|
||||
<link rel="alternate" hreflang="en" href="https://riricdev.tail5ea5cd.ts.net/en/projets/" />
|
||||
<link rel="alternate" hreflang="x-default" href="https://riricdev.tail5ea5cd.ts.net/fr/projets/" />
|
||||
<meta name="theme-color" content="#070a0f" />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:site_name" content="Zektyc" />
|
||||
<meta property="og:title" content="Projets · Zektyc" />
|
||||
<meta property="og:description" content="Projets réalisés ou contribués par Zektyc : test d'empreinte digitale, pentest, outils open source." />
|
||||
<meta property="og:url" content="https://riricdev.tail5ea5cd.ts.net/projets/" />
|
||||
<meta property="og:url" content="https://riricdev.tail5ea5cd.ts.net/fr/projets/" />
|
||||
<meta property="og:image" content="https://riricdev.tail5ea5cd.ts.net/og-image.png" />
|
||||
<meta property="og:locale" content="fr_FR" />
|
||||
<meta property="og:locale:alternate" content="en_US" />
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
User-agent: *
|
||||
Allow: /
|
||||
Disallow: /z-panel/
|
||||
Sitemap: https://zektyc.duckdns.org/sitemap.xml
|
||||
Sitemap: https://riricdev.tail5ea5cd.ts.net/sitemap.xml
|
||||
|
|
|
|||
|
|
@ -1,45 +1,73 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml">
|
||||
<url>
|
||||
<loc>https://zektyc.duckdns.org/en/</loc>
|
||||
<lastmod>2026-08-14</lastmod>
|
||||
<xhtml:link href="https://zektyc.duckdns.org/fr/" hreflang="fr" rel="alternate"/>
|
||||
<xhtml:link href="https://zektyc.duckdns.org/en/" hreflang="en" rel="alternate"/>
|
||||
<xhtml:link href="https://zektyc.duckdns.org/fr/" hreflang="x-default" rel="alternate"/>
|
||||
<loc>https://riricdev.tail5ea5cd.ts.net/en/</loc>
|
||||
<lastmod>2026-09-06</lastmod>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/fr/" hreflang="fr" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/en/" hreflang="en" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/fr/" hreflang="x-default" rel="alternate"/>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://zektyc.duckdns.org/en/blog/</loc>
|
||||
<loc>https://riricdev.tail5ea5cd.ts.net/en/blog/</loc>
|
||||
<lastmod>2026-08-14</lastmod>
|
||||
<xhtml:link href="https://zektyc.duckdns.org/fr/blog/" hreflang="fr" rel="alternate"/>
|
||||
<xhtml:link href="https://zektyc.duckdns.org/en/blog/" hreflang="en" rel="alternate"/>
|
||||
<xhtml:link href="https://zektyc.duckdns.org/fr/blog/" hreflang="x-default" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/fr/blog/" hreflang="fr" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/en/blog/" hreflang="en" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/fr/blog/" hreflang="x-default" rel="alternate"/>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://zektyc.duckdns.org/en/fingerprint-test</loc>
|
||||
<loc>https://riricdev.tail5ea5cd.ts.net/en/equipe</loc>
|
||||
<lastmod>2026-08-14</lastmod>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/fr/equipe" hreflang="fr" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/en/equipe" hreflang="en" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/fr/equipe" hreflang="x-default" rel="alternate"/>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://riricdev.tail5ea5cd.ts.net/en/fingerprint-test</loc>
|
||||
<lastmod>2026-08-16</lastmod>
|
||||
<xhtml:link href="https://zektyc.duckdns.org/fr/fingerprint-test" hreflang="fr" rel="alternate"/>
|
||||
<xhtml:link href="https://zektyc.duckdns.org/en/fingerprint-test" hreflang="en" rel="alternate"/>
|
||||
<xhtml:link href="https://zektyc.duckdns.org/fr/fingerprint-test" hreflang="x-default" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/fr/fingerprint-test" hreflang="fr" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/en/fingerprint-test" hreflang="en" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/fr/fingerprint-test" hreflang="x-default" rel="alternate"/>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://zektyc.duckdns.org/en/privacy-policy</loc>
|
||||
<loc>https://riricdev.tail5ea5cd.ts.net/en/privacy-policy</loc>
|
||||
<lastmod>2026-08-14</lastmod>
|
||||
<xhtml:link href="https://zektyc.duckdns.org/fr/privacy-policy" hreflang="fr" rel="alternate"/>
|
||||
<xhtml:link href="https://zektyc.duckdns.org/en/privacy-policy" hreflang="en" rel="alternate"/>
|
||||
<xhtml:link href="https://zektyc.duckdns.org/fr/privacy-policy" hreflang="x-default" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/fr/privacy-policy" hreflang="fr" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/en/privacy-policy" hreflang="en" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/fr/privacy-policy" hreflang="x-default" rel="alternate"/>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://zektyc.duckdns.org/en/projets</loc>
|
||||
<loc>https://riricdev.tail5ea5cd.ts.net/en/projets</loc>
|
||||
<lastmod>2026-08-17</lastmod>
|
||||
<xhtml:link href="https://zektyc.duckdns.org/fr/projets" hreflang="fr" rel="alternate"/>
|
||||
<xhtml:link href="https://zektyc.duckdns.org/en/projets" hreflang="en" rel="alternate"/>
|
||||
<xhtml:link href="https://zektyc.duckdns.org/fr/projets" hreflang="x-default" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/fr/projets" hreflang="fr" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/en/projets" hreflang="en" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/fr/projets" hreflang="x-default" rel="alternate"/>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://zektyc.duckdns.org/en/tos</loc>
|
||||
<loc>https://riricdev.tail5ea5cd.ts.net/en/tos</loc>
|
||||
<lastmod>2026-08-14</lastmod>
|
||||
<xhtml:link href="https://zektyc.duckdns.org/fr/tos" hreflang="fr" rel="alternate"/>
|
||||
<xhtml:link href="https://zektyc.duckdns.org/en/tos" hreflang="en" rel="alternate"/>
|
||||
<xhtml:link href="https://zektyc.duckdns.org/fr/tos" hreflang="x-default" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/fr/tos" hreflang="fr" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/en/tos" hreflang="en" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/fr/tos" hreflang="x-default" rel="alternate"/>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://riricdev.tail5ea5cd.ts.net/en/zmap</loc>
|
||||
<lastmod>2026-08-17</lastmod>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/fr/zmap" hreflang="fr" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/en/zmap" hreflang="en" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/fr/zmap" hreflang="x-default" rel="alternate"/>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://riricdev.tail5ea5cd.ts.net/en/zmap/archives</loc>
|
||||
<lastmod>2026-08-17</lastmod>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/fr/zmap/archives" hreflang="fr" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/en/zmap/archives" hreflang="en" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/fr/zmap/archives" hreflang="x-default" rel="alternate"/>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://riricdev.tail5ea5cd.ts.net/en/zmap/road-speeds</loc>
|
||||
<lastmod>2026-08-17</lastmod>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/fr/zmap/vitesses-par-route" hreflang="fr" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/en/zmap/road-speeds" hreflang="en" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/fr/zmap/vitesses-par-route" hreflang="x-default" rel="alternate"/>
|
||||
</url>
|
||||
</urlset>
|
||||
|
|
|
|||
|
|
@ -1,45 +1,73 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml">
|
||||
<url>
|
||||
<loc>https://zektyc.duckdns.org/fr/</loc>
|
||||
<lastmod>2026-08-14</lastmod>
|
||||
<xhtml:link href="https://zektyc.duckdns.org/fr/" hreflang="fr" rel="alternate"/>
|
||||
<xhtml:link href="https://zektyc.duckdns.org/en/" hreflang="en" rel="alternate"/>
|
||||
<xhtml:link href="https://zektyc.duckdns.org/fr/" hreflang="x-default" rel="alternate"/>
|
||||
<loc>https://riricdev.tail5ea5cd.ts.net/fr/</loc>
|
||||
<lastmod>2026-09-06</lastmod>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/fr/" hreflang="fr" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/en/" hreflang="en" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/fr/" hreflang="x-default" rel="alternate"/>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://zektyc.duckdns.org/fr/blog/</loc>
|
||||
<loc>https://riricdev.tail5ea5cd.ts.net/fr/blog/</loc>
|
||||
<lastmod>2026-08-14</lastmod>
|
||||
<xhtml:link href="https://zektyc.duckdns.org/fr/blog/" hreflang="fr" rel="alternate"/>
|
||||
<xhtml:link href="https://zektyc.duckdns.org/en/blog/" hreflang="en" rel="alternate"/>
|
||||
<xhtml:link href="https://zektyc.duckdns.org/fr/blog/" hreflang="x-default" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/fr/blog/" hreflang="fr" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/en/blog/" hreflang="en" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/fr/blog/" hreflang="x-default" rel="alternate"/>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://zektyc.duckdns.org/fr/fingerprint-test</loc>
|
||||
<loc>https://riricdev.tail5ea5cd.ts.net/fr/equipe</loc>
|
||||
<lastmod>2026-08-14</lastmod>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/fr/equipe" hreflang="fr" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/en/equipe" hreflang="en" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/fr/equipe" hreflang="x-default" rel="alternate"/>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://riricdev.tail5ea5cd.ts.net/fr/fingerprint-test</loc>
|
||||
<lastmod>2026-08-16</lastmod>
|
||||
<xhtml:link href="https://zektyc.duckdns.org/fr/fingerprint-test" hreflang="fr" rel="alternate"/>
|
||||
<xhtml:link href="https://zektyc.duckdns.org/en/fingerprint-test" hreflang="en" rel="alternate"/>
|
||||
<xhtml:link href="https://zektyc.duckdns.org/fr/fingerprint-test" hreflang="x-default" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/fr/fingerprint-test" hreflang="fr" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/en/fingerprint-test" hreflang="en" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/fr/fingerprint-test" hreflang="x-default" rel="alternate"/>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://zektyc.duckdns.org/fr/privacy-policy</loc>
|
||||
<loc>https://riricdev.tail5ea5cd.ts.net/fr/privacy-policy</loc>
|
||||
<lastmod>2026-08-14</lastmod>
|
||||
<xhtml:link href="https://zektyc.duckdns.org/fr/privacy-policy" hreflang="fr" rel="alternate"/>
|
||||
<xhtml:link href="https://zektyc.duckdns.org/en/privacy-policy" hreflang="en" rel="alternate"/>
|
||||
<xhtml:link href="https://zektyc.duckdns.org/fr/privacy-policy" hreflang="x-default" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/fr/privacy-policy" hreflang="fr" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/en/privacy-policy" hreflang="en" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/fr/privacy-policy" hreflang="x-default" rel="alternate"/>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://zektyc.duckdns.org/fr/projets</loc>
|
||||
<loc>https://riricdev.tail5ea5cd.ts.net/fr/projets</loc>
|
||||
<lastmod>2026-08-17</lastmod>
|
||||
<xhtml:link href="https://zektyc.duckdns.org/fr/projets" hreflang="fr" rel="alternate"/>
|
||||
<xhtml:link href="https://zektyc.duckdns.org/en/projets" hreflang="en" rel="alternate"/>
|
||||
<xhtml:link href="https://zektyc.duckdns.org/fr/projets" hreflang="x-default" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/fr/projets" hreflang="fr" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/en/projets" hreflang="en" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/fr/projets" hreflang="x-default" rel="alternate"/>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://zektyc.duckdns.org/fr/tos</loc>
|
||||
<loc>https://riricdev.tail5ea5cd.ts.net/fr/tos</loc>
|
||||
<lastmod>2026-08-14</lastmod>
|
||||
<xhtml:link href="https://zektyc.duckdns.org/fr/tos" hreflang="fr" rel="alternate"/>
|
||||
<xhtml:link href="https://zektyc.duckdns.org/en/tos" hreflang="en" rel="alternate"/>
|
||||
<xhtml:link href="https://zektyc.duckdns.org/fr/tos" hreflang="x-default" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/fr/tos" hreflang="fr" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/en/tos" hreflang="en" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/fr/tos" hreflang="x-default" rel="alternate"/>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://riricdev.tail5ea5cd.ts.net/fr/zmap</loc>
|
||||
<lastmod>2026-08-17</lastmod>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/fr/zmap" hreflang="fr" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/en/zmap" hreflang="en" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/fr/zmap" hreflang="x-default" rel="alternate"/>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://riricdev.tail5ea5cd.ts.net/fr/zmap/archives</loc>
|
||||
<lastmod>2026-08-17</lastmod>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/fr/zmap/archives" hreflang="fr" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/en/zmap/archives" hreflang="en" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/fr/zmap/archives" hreflang="x-default" rel="alternate"/>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://riricdev.tail5ea5cd.ts.net/fr/zmap/vitesses-par-route</loc>
|
||||
<lastmod>2026-08-17</lastmod>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/fr/zmap/vitesses-par-route" hreflang="fr" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/en/zmap/road-speeds" hreflang="en" rel="alternate"/>
|
||||
<xhtml:link href="https://riricdev.tail5ea5cd.ts.net/fr/zmap/vitesses-par-route" hreflang="x-default" rel="alternate"/>
|
||||
</url>
|
||||
</urlset>
|
||||
|
|
|
|||
|
|
@ -3,11 +3,11 @@
|
|||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
|
||||
<sitemap>
|
||||
<loc>https://zektyc.duckdns.org/sitemap-main.xml</loc>
|
||||
<lastmod>2026-08-17</lastmod>
|
||||
<loc>https://riricdev.tail5ea5cd.ts.net/sitemap-main.xml</loc>
|
||||
<lastmod>2026-09-06</lastmod>
|
||||
</sitemap>
|
||||
<sitemap>
|
||||
<loc>https://zektyc.duckdns.org/sitemap-en.xml</loc>
|
||||
<lastmod>2026-08-17</lastmod>
|
||||
<loc>https://riricdev.tail5ea5cd.ts.net/sitemap-en.xml</loc>
|
||||
<lastmod>2026-09-06</lastmod>
|
||||
</sitemap>
|
||||
</sitemapindex>
|
||||
</sitemapindex>
|
||||
|
|
@ -9,6 +9,11 @@
|
|||
/>
|
||||
<meta name="robots" content="index, follow" />
|
||||
<title>Terms of Service · Zektyc</title>
|
||||
|
||||
<link rel="canonical" href="https://riricdev.tail5ea5cd.ts.net/en/tos" />
|
||||
<link rel="alternate" hreflang="fr" href="https://riricdev.tail5ea5cd.ts.net/fr/tos" />
|
||||
<link rel="alternate" hreflang="en" href="https://riricdev.tail5ea5cd.ts.net/en/tos" />
|
||||
<link rel="alternate" hreflang="x-default" href="https://riricdev.tail5ea5cd.ts.net/fr/tos" />
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
||||
<link rel="shortcut icon" href="/favicon.ico" />
|
||||
<link rel="stylesheet" href="/css/style.css?v=8" />
|
||||
|
|
|
|||
|
|
@ -9,6 +9,11 @@
|
|||
/>
|
||||
<meta name="robots" content="index, follow" />
|
||||
<title>Conditions Générales d'Utilisation · Zektyc</title>
|
||||
|
||||
<link rel="canonical" href="https://riricdev.tail5ea5cd.ts.net/fr/tos" />
|
||||
<link rel="alternate" hreflang="fr" href="https://riricdev.tail5ea5cd.ts.net/fr/tos" />
|
||||
<link rel="alternate" hreflang="en" href="https://riricdev.tail5ea5cd.ts.net/en/tos" />
|
||||
<link rel="alternate" hreflang="x-default" href="https://riricdev.tail5ea5cd.ts.net/fr/tos" />
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
||||
<link rel="shortcut icon" href="/favicon.ico" />
|
||||
<link rel="stylesheet" href="/css/style.css?v=8" />
|
||||
|
|
|
|||
|
|
@ -5,6 +5,10 @@
|
|||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<meta name="robots" content="index, follow" />
|
||||
<title>Zenyth Browser · Zektyc</title>
|
||||
|
||||
<link rel="canonical" href="https://riricdev.tail5ea5cd.ts.net/fr/zenyth/" />
|
||||
<link rel="alternate" hreflang="fr" href="https://riricdev.tail5ea5cd.ts.net/fr/zenyth/" />
|
||||
<link rel="alternate" hreflang="x-default" href="https://riricdev.tail5ea5cd.ts.net/fr/zenyth/" />
|
||||
<meta name="description" content="Zenyth Browser : Firefox durci anti-fingerprinting. Résiste aux sondes ZFP/ZPD. Paquet RPM prêt à installer." />
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
||||
<link rel="stylesheet" href="/css/style.css?v=8" />
|
||||
|
|
|
|||
|
|
@ -6,13 +6,16 @@
|
|||
<meta name="description" content="ZMap archives and changelog: all versions of the free OpenStreetMap Android mapping app with EV charging stations." />
|
||||
<meta name="robots" content="index, follow" />
|
||||
<title>Archives & changelog · ZMap · Zektyc</title>
|
||||
<link rel="canonical" href="https://riricdev.tail5ea5cd.ts.net/zmap/en/archives" />
|
||||
<link rel="canonical" href="https://riricdev.tail5ea5cd.ts.net/en/zmap/archives" />
|
||||
<link rel="alternate" hreflang="fr" href="https://riricdev.tail5ea5cd.ts.net/fr/zmap/archives" />
|
||||
<link rel="alternate" hreflang="en" href="https://riricdev.tail5ea5cd.ts.net/en/zmap/archives" />
|
||||
<link rel="alternate" hreflang="x-default" href="https://riricdev.tail5ea5cd.ts.net/fr/zmap/archives" />
|
||||
<meta name="theme-color" content="#070a0f" />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:site_name" content="Zektyc" />
|
||||
<meta property="og:title" content="Archives & changelog · ZMap" />
|
||||
<meta property="og:description" content="Every ZMap version with its changelog and download links." />
|
||||
<meta property="og:url" content="https://riricdev.tail5ea5cd.ts.net/zmap/en/archives" />
|
||||
<meta property="og:url" content="https://riricdev.tail5ea5cd.ts.net/en/zmap/archives" />
|
||||
<meta property="og:image" content="https://riricdev.tail5ea5cd.ts.net/og-image.png" />
|
||||
<meta property="og:locale" content="en_US" />
|
||||
<meta property="og:locale:alternate" content="fr_FR" />
|
||||
|
|
@ -6,13 +6,16 @@
|
|||
<meta name="description" content="Archives et changelog de ZMap : toutes les versions de l'application Android de cartographie libre OpenStreetMap avec les bornes de recharge électrique." />
|
||||
<meta name="robots" content="index, follow" />
|
||||
<title>Archives & changelog · ZMap · Zektyc</title>
|
||||
<link rel="canonical" href="https://riricdev.tail5ea5cd.ts.net/zmap/archives" />
|
||||
<link rel="canonical" href="https://riricdev.tail5ea5cd.ts.net/fr/zmap/archives" />
|
||||
<link rel="alternate" hreflang="fr" href="https://riricdev.tail5ea5cd.ts.net/fr/zmap/archives" />
|
||||
<link rel="alternate" hreflang="en" href="https://riricdev.tail5ea5cd.ts.net/en/zmap/archives" />
|
||||
<link rel="alternate" hreflang="x-default" href="https://riricdev.tail5ea5cd.ts.net/fr/zmap/archives" />
|
||||
<meta name="theme-color" content="#070a0f" />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:site_name" content="Zektyc" />
|
||||
<meta property="og:title" content="Archives & changelog · ZMap" />
|
||||
<meta property="og:description" content="Toutes les versions de ZMap avec leur changelog et leurs liens de téléchargement." />
|
||||
<meta property="og:url" content="https://riricdev.tail5ea5cd.ts.net/zmap/archives" />
|
||||
<meta property="og:url" content="https://riricdev.tail5ea5cd.ts.net/fr/zmap/archives" />
|
||||
<meta property="og:image" content="https://riricdev.tail5ea5cd.ts.net/og-image.png" />
|
||||
<meta property="og:locale" content="fr_FR" />
|
||||
<meta property="og:locale:alternate" content="en_US" />
|
||||
|
|
|
|||
|
|
@ -6,13 +6,16 @@
|
|||
<meta name="description" content="ZMap: a free Android mapping app using OpenStreetMap, showing EV charging stations across Europe (Switzerland included)." />
|
||||
<meta name="robots" content="index, follow" />
|
||||
<title>ZMap · Zektyc</title>
|
||||
<link rel="canonical" href="https://riricdev.tail5ea5cd.ts.net/zmap/en/" />
|
||||
<link rel="canonical" href="https://riricdev.tail5ea5cd.ts.net/en/zmap/" />
|
||||
<link rel="alternate" hreflang="fr" href="https://riricdev.tail5ea5cd.ts.net/fr/zmap/" />
|
||||
<link rel="alternate" hreflang="en" href="https://riricdev.tail5ea5cd.ts.net/en/zmap/" />
|
||||
<link rel="alternate" hreflang="x-default" href="https://riricdev.tail5ea5cd.ts.net/fr/zmap/" />
|
||||
<meta name="theme-color" content="#070a0f" />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:site_name" content="Zektyc" />
|
||||
<meta property="og:title" content="ZMap · Zektyc" />
|
||||
<meta property="og:description" content="Free OpenStreetMap map with EV charging stations across Europe (Switzerland included). Android app with automatic updates." />
|
||||
<meta property="og:url" content="https://riricdev.tail5ea5cd.ts.net/zmap/en/" />
|
||||
<meta property="og:url" content="https://riricdev.tail5ea5cd.ts.net/en/zmap/" />
|
||||
<meta property="og:image" content="https://riricdev.tail5ea5cd.ts.net/og-image.png" />
|
||||
<meta property="og:locale" content="en_US" />
|
||||
<meta property="og:locale:alternate" content="fr_FR" />
|
||||
|
|
|
|||
|
|
@ -6,13 +6,16 @@
|
|||
<meta name="description" content="ZMap : application Android de cartographie libre utilisant OpenStreetMap, affichant les bornes de recharge électrique en Europe (Suisse incluse)." />
|
||||
<meta name="robots" content="index, follow" />
|
||||
<title>ZMap · Zektyc</title>
|
||||
<link rel="canonical" href="https://riricdev.tail5ea5cd.ts.net/zmap/" />
|
||||
<link rel="canonical" href="https://riricdev.tail5ea5cd.ts.net/fr/zmap/" />
|
||||
<link rel="alternate" hreflang="fr" href="https://riricdev.tail5ea5cd.ts.net/fr/zmap/" />
|
||||
<link rel="alternate" hreflang="en" href="https://riricdev.tail5ea5cd.ts.net/en/zmap/" />
|
||||
<link rel="alternate" hreflang="x-default" href="https://riricdev.tail5ea5cd.ts.net/fr/zmap/" />
|
||||
<meta name="theme-color" content="#070a0f" />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:site_name" content="Zektyc" />
|
||||
<meta property="og:title" content="ZMap · Zektyc" />
|
||||
<meta property="og:description" content="Carte libre OpenStreetMap avec les bornes de recharge électrique en Europe (Suisse incluse). Application Android, mise à jour automatique." />
|
||||
<meta property="og:url" content="https://riricdev.tail5ea5cd.ts.net/zmap/" />
|
||||
<meta property="og:url" content="https://riricdev.tail5ea5cd.ts.net/fr/zmap/" />
|
||||
<meta property="og:image" content="https://riricdev.tail5ea5cd.ts.net/og-image.png" />
|
||||
<meta property="og:locale" content="fr_FR" />
|
||||
<meta property="og:locale:alternate" content="en_US" />
|
||||
|
|
|
|||
|
|
@ -6,13 +6,16 @@
|
|||
<meta name="description" content="ZMap's per-road speed database: 90.5 million sampled points, 3.6 million km of roads mapped with their speed limit (OpenStreetMap), across all of Europe." />
|
||||
<meta name="robots" content="index, follow" />
|
||||
<title>Per-road speeds · ZMap · Zektyc</title>
|
||||
<link rel="canonical" href="https://riricdev.tail5ea5cd.ts.net/zmap/en/road-speeds/" />
|
||||
<link rel="canonical" href="https://riricdev.tail5ea5cd.ts.net/en/zmap/road-speeds/" />
|
||||
<link rel="alternate" hreflang="fr" href="https://riricdev.tail5ea5cd.ts.net/fr/zmap/vitesses-par-route/" />
|
||||
<link rel="alternate" hreflang="en" href="https://riricdev.tail5ea5cd.ts.net/en/zmap/road-speeds/" />
|
||||
<link rel="alternate" hreflang="x-default" href="https://riricdev.tail5ea5cd.ts.net/fr/zmap/vitesses-par-route/" />
|
||||
<meta name="theme-color" content="#070a0f" />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:site_name" content="Zektyc" />
|
||||
<meta property="og:title" content="Per-road speeds · ZMap" />
|
||||
<meta property="og:description" content="ZMap knows the speed limit of every road in Europe: 90.5 million points, 3.6 million km, built from OpenStreetMap data." />
|
||||
<meta property="og:url" content="https://riricdev.tail5ea5cd.ts.net/zmap/en/road-speeds/" />
|
||||
<meta property="og:url" content="https://riricdev.tail5ea5cd.ts.net/en/zmap/road-speeds/" />
|
||||
<meta property="og:locale" content="en_US" />
|
||||
<meta property="og:locale:alternate" content="fr_FR" />
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
||||
|
|
@ -6,13 +6,16 @@
|
|||
<meta name="description" content="La base de données des vitesses par route de ZMap : 90,5 millions de points, 3,6 millions de km de routes cartographiées avec leur limite de vitesse (OpenStreetMap), sur toute l'Europe." />
|
||||
<meta name="robots" content="index, follow" />
|
||||
<title>Vitesses par route · ZMap · Zektyc</title>
|
||||
<link rel="canonical" href="https://riricdev.tail5ea5cd.ts.net/zmap/vitesses-par-route/" />
|
||||
<link rel="canonical" href="https://riricdev.tail5ea5cd.ts.net/fr/zmap/vitesses-par-route/" />
|
||||
<link rel="alternate" hreflang="fr" href="https://riricdev.tail5ea5cd.ts.net/fr/zmap/vitesses-par-route/" />
|
||||
<link rel="alternate" hreflang="en" href="https://riricdev.tail5ea5cd.ts.net/en/zmap/road-speeds/" />
|
||||
<link rel="alternate" hreflang="x-default" href="https://riricdev.tail5ea5cd.ts.net/fr/zmap/vitesses-par-route/" />
|
||||
<meta name="theme-color" content="#070a0f" />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:site_name" content="Zektyc" />
|
||||
<meta property="og:title" content="Vitesses par route · ZMap" />
|
||||
<meta property="og:description" content="ZMap connaît la limite de vitesse de chaque route d'Europe : 90,5 millions de points, 3,6 millions de km, à partir des données OpenStreetMap." />
|
||||
<meta property="og:url" content="https://riricdev.tail5ea5cd.ts.net/zmap/vitesses-par-route/" />
|
||||
<meta property="og:url" content="https://riricdev.tail5ea5cd.ts.net/fr/zmap/vitesses-par-route/" />
|
||||
<meta property="og:locale" content="fr_FR" />
|
||||
<meta property="og:locale:alternate" content="en_US" />
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
||||
|
|
|
|||
|
|
@ -73,11 +73,11 @@ const MAX_RULES_LEN = 2000
|
|||
|
||||
const HONEYPOT_MAX_IPS = 500
|
||||
const HONEYPOT_CONFIG: SiteConfig = {
|
||||
domain: "zektyc.duckdns.org",
|
||||
domain: "riricdev.tail5ea5cd.ts.net",
|
||||
siteName: "Zektyc",
|
||||
dbName: "wordpress",
|
||||
dbUser: "wp_admin",
|
||||
adminEmail: "admin@zektyc.duckdns.org",
|
||||
adminEmail: "admin@riricdev.tail5ea5cd.ts.net",
|
||||
phpVersion: "7.4.33",
|
||||
serverSoftware: "Apache/2.4.51 (Debian)",
|
||||
serverName: "web-01",
|
||||
|
|
@ -139,6 +139,48 @@ function html(body: string, cache = "no-cache") {
|
|||
})
|
||||
}
|
||||
|
||||
function langRedirectPage(rest: string): string {
|
||||
const fr = `${SITE_URL}/fr${rest}`
|
||||
const en = `${SITE_URL}/en${rest}`
|
||||
const restJs = JSON.stringify(rest)
|
||||
return `<!doctype html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<meta name="robots" content="noindex, follow" />
|
||||
<title>Zektyc</title>
|
||||
<link rel="canonical" href="${fr}" />
|
||||
<link rel="alternate" hreflang="fr" href="${fr}" />
|
||||
<link rel="alternate" hreflang="en" href="${en}" />
|
||||
<link rel="alternate" hreflang="x-default" href="${fr}" />
|
||||
<meta http-equiv="refresh" content="0; url=${fr}" />
|
||||
<script>(function(){
|
||||
var rest=${restJs};
|
||||
var target="/fr"+rest;
|
||||
try{
|
||||
var saved=localStorage.getItem("zektyc-lang");
|
||||
if(saved==="en"||saved==="fr"){ target="/"+saved+rest; }
|
||||
else {
|
||||
var ln=(navigator.language||navigator.userLanguage||"").toLowerCase();
|
||||
if(ln.indexOf("en")===0) target="/en"+rest;
|
||||
}
|
||||
}catch(e){}
|
||||
if(target.indexOf("/en")===0){
|
||||
fetch(target,{method:"HEAD",cache:"no-store"}).then(function(r){
|
||||
location.replace(r.ok?target:"/fr"+rest);
|
||||
}).catch(function(){ location.replace("/fr"+rest); });
|
||||
} else {
|
||||
location.replace(target);
|
||||
}
|
||||
})();</script>
|
||||
</head>
|
||||
<body>
|
||||
<p>Redirection… / Redirecting…</p>
|
||||
</body>
|
||||
</html>`
|
||||
}
|
||||
|
||||
function bearerToken(req: Request): string | null {
|
||||
const h = req.headers.get("authorization")
|
||||
return h ? (h.match(/^Bearer\s+(\S+)$/i)?.[1] ?? null) : null
|
||||
|
|
@ -533,20 +575,20 @@ function errorPage(status: number, req?: Request): Response {
|
|||
.replace(/__MSG__/g, isFr
|
||||
? "La page que vous recherchez n\u2019existe pas, a \u00e9t\u00e9 d\u00e9plac\u00e9e ou une erreur s\u2019est produite."
|
||||
: "The page you are looking for does not exist, has been moved, or an error occurred.")
|
||||
.replace(/__HREF__/g, `/${isFr ? "" : "en/"}`)
|
||||
.replace(/__HREF__/g, `/${isFr ? "fr" : "en"}/`)
|
||||
.replace(/__BACK__/g, isFr ? "Retour \u00e0 l\u2019accueil" : "Back to home")
|
||||
.replace(/__NEWS_HREF__/g, isFr ? "blog/" : "en/blog/")
|
||||
.replace(/__NEWS_HREF__/g, isFr ? "fr/blog/" : "en/blog/")
|
||||
.replace(/__NEWS__/g, isFr ? "Blog" : "Blog")
|
||||
.replace(/__PROJECTS_HREF__/g, isFr ? "projets/" : "en/projets/")
|
||||
.replace(/__PROJECTS_HREF__/g, isFr ? "fr/projets/" : "en/projets/")
|
||||
.replace(/__PROJECTS__/g, isFr ? "Projets" : "Projects")
|
||||
.replace(/__FR_ACTIVE__/g, isFr ? "active" : "")
|
||||
.replace(/__EN_ACTIVE__/g, !isFr ? "active" : "")
|
||||
.replace(/__FR_LABEL__/g, isFr ? "<strong>FR</strong>" : "FR")
|
||||
.replace(/__EN_LABEL__/g, !isFr ? "<strong>EN</strong>" : "EN")
|
||||
.replace(/__NOTE__/g, isFr ? "Ce site ne collecte rien. Aucun cookie, aucun tracker." : "This site collects nothing. No cookies, no trackers.")
|
||||
.replace(/__TOS_HREF__/g, isFr ? "/tos" : "/en/tos")
|
||||
.replace(/__TOS_HREF__/g, isFr ? "/fr/tos" : "/en/tos")
|
||||
.replace(/__TOS__/g, isFr ? "Conditions d\u2019utilisation" : "Terms of Service")
|
||||
.replace(/__PRIV_HREF__/g, isFr ? "/privacy-policy" : "/en/privacy-policy")
|
||||
.replace(/__PRIV_HREF__/g, isFr ? "/fr/privacy-policy" : "/en/privacy-policy")
|
||||
.replace(/__PRIV__/g, isFr ? "Confidentialit\u00e9" : "Privacy")
|
||||
|
||||
return new Response(body, {
|
||||
|
|
@ -682,12 +724,16 @@ function newsIndex(lang: "fr" | "en"): string {
|
|||
|
||||
function writeSitemaps(articles: Article[]) {
|
||||
const base: { fr: string; en: string; lm: string }[] = [
|
||||
{ fr: "/fr/", en: "/en/", lm: "2026-08-14" },
|
||||
{ fr: "/fr/", en: "/en/", lm: "2026-09-06" },
|
||||
{ fr: "/fr/tos", en: "/en/tos", lm: "2026-08-14" },
|
||||
{ fr: "/fr/privacy-policy", en: "/en/privacy-policy", lm: "2026-08-14" },
|
||||
{ fr: "/fr/blog/", en: "/en/blog/", lm: "2026-08-14" },
|
||||
{ fr: "/fr/fingerprint-test", en: "/en/fingerprint-test", lm: "2026-08-16" },
|
||||
{ fr: "/fr/projets", en: "/en/projets", lm: "2026-08-17" },
|
||||
{ fr: "/fr/equipe", en: "/en/equipe", lm: "2026-08-14" },
|
||||
{ fr: "/fr/zmap", en: "/en/zmap", lm: "2026-08-17" },
|
||||
{ fr: "/fr/zmap/archives", en: "/en/zmap/archives", lm: "2026-08-17" },
|
||||
{ fr: "/fr/zmap/vitesses-par-route", en: "/en/zmap/road-speeds", lm: "2026-08-17" },
|
||||
]
|
||||
const art = articles.map((a) => ({ fr: `/fr/blog/${a.slug}/`, en: `/en/blog/${a.slug}/`, lm: a.modified || a.published }))
|
||||
const pages = [...base, ...art].sort((x, y) => x.fr.localeCompare(y.fr))
|
||||
|
|
@ -746,7 +792,7 @@ function clientIp(req: Request): string {
|
|||
|
||||
const LANG_ROUTES: Record<string, (rest: string) => string> = {
|
||||
fr: (rest) => (rest ? "/" + rest : "/"),
|
||||
en: (rest) => (rest ? "/" + rest.replace(/\/+$/, "") + "/en" : "/"),
|
||||
en: (rest) => (rest ? "/" + rest.replace(/\/+$/, "") + "/en" : "/en"),
|
||||
}
|
||||
|
||||
function resolveLangPath(path: string): string | null {
|
||||
|
|
@ -764,6 +810,13 @@ function lookup(path: string) {
|
|||
return resolved
|
||||
}
|
||||
|
||||
function isHtmlFile(path: string): boolean {
|
||||
try {
|
||||
const resolved = lookup(path)
|
||||
return !!resolved && resolved.endsWith(".html") && existsSync(resolved)
|
||||
} catch { return false }
|
||||
}
|
||||
|
||||
function matchArticle(p: string, articles: Article[]): { article: Article; lang: "fr" | "en" } | null {
|
||||
const m = p.match(/^\/blog\/([a-z0-9-]+)(?:\/en)?\/?$/)
|
||||
if (!m) return null
|
||||
|
|
@ -773,6 +826,10 @@ function matchArticle(p: string, articles: Article[]): { article: Article; lang:
|
|||
return article ? { article, lang } : null
|
||||
}
|
||||
|
||||
function artPath(matcher: { article: Article; lang: "fr" | "en" }): string {
|
||||
return `/blog/${matcher.article.slug}`
|
||||
}
|
||||
|
||||
function serveAdminIndex() {
|
||||
const f = file(normalize(join(root, "z-panel", "index.html")))
|
||||
return f.exists().then((exists) =>
|
||||
|
|
@ -1218,13 +1275,29 @@ server = serve({
|
|||
if (page) return html(page, "public, max-age=300")
|
||||
}
|
||||
|
||||
const p = resolveLangPath(pathname) ?? pathname
|
||||
// Les chemins sans préfixe de langue (/fr/ ou /en/) sont des points d'entrée :
|
||||
// on ne sert jamais de page ici, on renvoie la page-redirect qui choisit la langue
|
||||
// (localStorage puis navigateur, sinon fr). Les assets, /api, /docs et le honeypot
|
||||
// WordPress restent intacts (ils ne se résolvent pas en page HTML).
|
||||
const articles = readArticles()
|
||||
if (!/^\/(fr|en)(\/|$)/.test(pathname)) {
|
||||
// Anciennes URLs EN de l'ère « /zmap/en/... » : 301 direct vers /en/zmap/...
|
||||
const legacyEn = pathname.match(/^\/zmap\/en(?:\/(.*))?$/)
|
||||
if (legacyEn) {
|
||||
const sub = legacyEn[1] ? "/" + legacyEn[1].replace(/\/+$/, "") : ""
|
||||
return new Response(null, { status: 301, headers: { Location: `/en/zmap${sub}/` } })
|
||||
}
|
||||
const artMatch = matchArticle(pathname, articles)
|
||||
if (artMatch) return html(langRedirectPage(artPath(artMatch)), "no-cache")
|
||||
if (isHtmlFile(pathname)) return html(langRedirectPage(pathname === "/" ? "/" : pathname), "no-cache")
|
||||
}
|
||||
|
||||
const p = resolveLangPath(pathname) ?? pathname
|
||||
const matched = matchArticle(p, articles)
|
||||
if (matched) return html(articlePage(matched.article, matched.lang))
|
||||
if (p === "/actualites" || p === "/actualites/") return new Response(null, { status: 301, headers: { Location: "/blog/" } })
|
||||
if (p === "/actualites" || p === "/actualites/") return new Response(null, { status: 301, headers: { Location: "/fr/blog/" } })
|
||||
if (p === "/actualites/en" || p === "/actualites/en/") return new Response(null, { status: 301, headers: { Location: "/en/blog/" } })
|
||||
if (p.startsWith("/actualites")) return new Response(null, { status: 301, headers: { Location: "/blog/" } })
|
||||
if (p.startsWith("/actualites")) return new Response(null, { status: 301, headers: { Location: "/fr/blog/" } })
|
||||
|
||||
const filePath = lookup(decodeURIComponent(p))
|
||||
if (!filePath) return new Response("Forbidden", { status: 403 })
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ const RATE_MAX = 30
|
|||
const RATE_WINDOW = 60_000
|
||||
|
||||
const UA =
|
||||
"ZMapProxy/1.0 (zektyc.duckdns.org; contact: riric65@protonmail.com; OSM proxy)"
|
||||
"ZMapProxy/1.0 (riricdev.tail5ea5cd.ts.net; contact: riric65@protonmail.com; OSM proxy)"
|
||||
|
||||
function json(data: unknown, status = 200): Response {
|
||||
return new Response(JSON.stringify(data), {
|
||||
|
|
|
|||
Loading…
Reference in a new issue