Найден корректный robots.txt
Файл управления сканированием сайта роботами
?
Robots.txt указывает поисковым роботам, какие страницы сканировать, а какие — нет. Ошибки в файле могут случайно закрыть важные разделы от индексации.
Robots.txt настроен корректно. Размер файла: 22032 байт. Загружен за: 0сек.
Проверяемая страница не запрещена в robots.txt.
Цепочка редиректов для файла robots.txt:
http://design-events.fun/robots.txt
301 MovedPermanently
https://design-events.fun/robots.txt
200 OK
Показать содержимое robots.txt
<!DOCTYPE html>
<html lang="ru" translate="no" class="notranslate">
<head>
<meta charset="UTF-8" />
<meta name="google" content="notranslate" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="icon" href="/favicon.svg" type="image/svg+xml" />
<title>Афиша дизайн-событий — календарь</title>
<meta name="description" content="Митапы, конференции, эфиры и воркшопы дизайн-комьюнити" />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://www.design-events.fun/" />
<meta property="og:title" content="Афиша дизайн-событий — календарь" />
<meta property="og:description" content="Митапы, конференции, эфиры и воркшопы дизайн-комьюнити" />
<meta property="og:locale" content="ru_RU" />
<meta property="og:image" content="https://www.design-events.fun/top-showcase-neon-green-abstract.png" />
<link rel="canonical" href="https://www.design-events.fun/" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="Афиша дизайн-событий — календарь" />
<meta name="twitter:description" content="Митапы, конференции, эфиры и воркшопы дизайн-комьюнити" />
<meta name="twitter:image" content="https://www.design-events.fun/top-showcase-neon-green-abstract.png" />
<script type="text/javascript">
// Telegram WebApp bridge грузим ТОЛЬКО внутри Telegram-webview.
// Вне его telegram.org недоступен из РФ: запрос висит ~61 с до
// ERR_CONNECTION_TIMED_OUT, а defer-скрипты откладывают DOMContentLoaded —
// измерено 04.08: скрипт отваливается на 62 184 мс, DOMContentLoaded на 62 214 мс.
// Детект тот же, что в src/app/utils/authEnvironment.ts (UA + WebviewProxy);
// window.Telegram здесь проверять нельзя — он появляется уже после загрузки скрипта.
(function () {
try {
var ua = navigator.userAgent || "";
var isTelegram =
/Telegram|TelegramBot|Telegram-iOS|TgWebView/i.test(ua) ||
!!(window.TelegramWebviewProxy || window.TelegramWebviewProxyProto);
if (!isTelegram) return;
var s = document.createElement("script");
s.src = "https://telegram.org/js/telegram-web-app.js?63";
s.async = true;
document.head.appendChild(s);
} catch (e) {}
})();
</script>
<script type="text/javascript">
// Telegram Web/Desktop передаёт подписанный initData в URL fragment.
// Не оставляем его в адресе до запуска Метрики/Clarity: fragment содержит
// user/id/signature/hash и раньше целиком попадал в startURL аналитики.
// Сохраняем значение только в памяти страницы — React прочитает его через
// getTelegramWebAppInitData(), а backend всё равно проверит подпись и auth_date.
(function () {
try {
var rawHash = String(window.location.hash || "").replace(/^#/, "");
if (!rawHash) return;
var hashParams = new URLSearchParams(rawHash);
var launchInitData = String(hashParams.get("tgWebAppData") || "").trim();
if (!launchInitData) return;
window.__telegramLaunchInitData = launchInitData;
[
"tgWebAppData",
"tgWebAppVersion",
"tgWebAppPlatform",
"tgWebAppThemeParams",
"tgWebAppBotInline",
"tgWebAppFullscreen",
].forEach(function (key) {
hashParams.delete(key);
});
var cleanHash = hashParams.toString();
var cleanUrl = window.location.pathname + window.location.search + (cleanHash ? "#" + cleanHash : "");
window.history.replaceState(window.history.state, "", cleanUrl);
} catch (e) {}
})();
</script>
<script type="text/javascript">
(function () {
var params = new URLSearchParams(window.location.search);
var forceReplaySafe = params.get("replay-safe") === "1";
var referrer = String(document.referrer || "").toLowerCase();
var isReplayReferrer =
referrer.includes("metrika.yandex.") ||
referrer.includes("webvisor.com") ||
referrer.includes("clarity.microsoft.com");
if (forceReplaySafe || isReplayReferrer) {
document.documentElement.classList.add("replay-safe");
}
})();
</script>
<!-- Аналитика (Метрика + Clarity): только прод-хосты и не-owner, init после idle (PROJECT.md §3.4) -->
<script type="text/javascript">
(function () {
var ALLOWED_HOSTS = ["www.design-events.fun", "design-events.fun"];
// Owner-режим дублируется в cookie: переживает очистку localStorage,
// общий для www и apex (domain=.design-events.fun). 2 года.
function setOwnerCookie(enabled) {
try {
var maxAge = enabled ? 63072000 : 0;
var base = "owner_mode=" + (enabled ? "1" : "") + ";path=/;max-age=" + maxAge + ";SameSite=Lax";
document.cookie =
location.hostname.indexOf("design-events.fun") !== -1
? base + ";domain=.design-events.fun"
: base;
} catch (e) {}
}
function hasOwnerCookie() {
try {
return document.cookie.split(";").some(function (c) {
return c.trim() === "owner_mode=1";
});
} catch (e) {
return false;
}
}
function analyticsEnabled() {
try {
var params = new URLSearchParams(window.location.search);
if (params.get("dev") === "1") {
localStorage.setItem("is_dev", "1");
}
if (
params.get("owner") === "1" ||
location.pathname === "/admin" ||
location.pathname.indexOf("/admin/") === 0
) {
localStorage.setItem("owner_mode", "1");
setOwnerCookie(true);
}
if (params.get("owner") === "0") {
localStorage.removeItem("owner_mode");
localStorage.removeItem("is_dev");
setOwnerCookie(false);
}
var isProdHost = ALLOWED_HOSTS.indexOf(location.hostname) !== -1;
var isOwner =
localStorage.getItem("owner_mode") === "1" ||
localStorage.getItem("is_dev") === "1" ||
hasOwnerCookie();
// Самолечение: cookie есть, а localStorage слетел — восстановить флаг.
if (isOwner && localStorage.getItem("owner_mode") !== "1") {
try {
localStorage.setItem("owner_mode", "1");
} catch (e) {}
setOwnerCookie(true);
}
return isProdHost && !isOwner;
} catch (e) {
return false;
}
}
function initMetrika() {
(function (m, e, t, r, i, k, a) {
m[i] =
m[i] ||
function () {
(m[i].a = m[i].a || []).push(arguments);
};
m[i].l = 1 * new Date();
for (var j = 0; j < document.scripts.length; j++) {
if (document.scripts[j].src === r) {
return;
}
}
(k = e.createElement(t)),
(a = e.getElementsByTagName(t)[0]),
(k.async = 1),
(k.src = r),
a.parentNode.insertBefore(k, a);
})(window, document, "script", "https://mc.yandex.ru/metrika/tag.js?id=106630808", "ym");
window.ym(106630808, "init", {
ssr: true,
webvisor: true,
clickmap: true,
ecommerce: "dataLayer",
referrer: document.referrer,
// Fragment не является частью продуктового URL и может содержать
// Telegram initData или OAuth-токены. В аналитику его не отправляем.
url: location.origin + location.pathname + location.search,
accurateTrackBounce: true,
trackLinks: true,
});
}
function initClarity() {
(function (c, l, a, r, i, t, y) {
c[a] =
c[a] ||
function () {
(c[a].q = c[a].q || []).push(arguments);
};
t = l.createElement(r);
t.async = 1;
t.src = "https://www.clarity.ms/tag/" + i;
y = l.getElementsByTagName(r)[0];
y.parentNode.insertBefore(t, y);
})(window, document, "clarity", "script", "vc5abie0ji");
}
if (!analyticsEnabled()) return;
var start = function () {
initMetrika();
initClarity();
};
if ("requestIdleCallback" in window) {
requestIdleCallback(start, { timeout: 3000 });
} else {
setTimeout(start, 1500);
}
})();
</script>
<style>
html,
body {
margin: 0;
min-height: 100%;
}
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
background: #090c12;
color: #f3f5f8;
}
#networkBootFallback {
--boot-bg-start: var(--af-surface, #121821);
--boot-bg-end: var(--af-bg, #090c12);
--boot-text: var(--af-text-primary, #f3f5f8);
--boot-muted: var(--af-text-muted, #9aa8b8);
--boot-accent: var(--af-accent, #d8fd81);
--boot-border: var(--af-border, rgba(255, 255, 255, 0.1));
--boot-surface: color-mix(in oklab, var(--boot-text) 7%, transparent);
--boot-surface-strong: color-mix(in oklab, var(--boot-text) 12%, transparent);
--boot-skeleton-base: color-mix(in oklab, var(--boot-text) 10%, transparent);
--boot-skeleton-shine: color-mix(in oklab, var(--boot-text) 22%, transparent);
--boot-accent-glow: color-mix(in oklab, var(--boot-accent) 10%, transparent);
position: fixed;
inset: 0;
z-index: 9999;
overflow: auto;
background:
linear-gradient(180deg, var(--boot-bg-start) 0%, var(--boot-bg-end) 56%),
radial-gradient(900px 320px at 50% -28%, var(--boot-accent-glow), transparent 68%);
color: var(--boot-text);
}
.boot-sr-only {
position: absolute;
width: 1px;
height: 1px;
margin: -1px;
padding: 0;
overflow: hidden;
clip: rect(0, 0, 0, 0);
border: 0;
}
.boot-shell {
margin: 0 auto;
width: min(1120px, calc(100% - 28px));
padding: 14px 0 22px;
}
.boot-header {
display: grid;
grid-template-columns: minmax(160px, 1fr) auto minmax(160px, 1fr);
align-items: center;
gap: 14px;
border: 1px solid var(--boot-border);
border-radius: 18px;
background: var(--boot-surface);
padding: 12px 14px;
}
.boot-brand {
color: var(--boot-accent);
font-size: clamp(22px, 2.5vw, 28px);
font-weight: 600;
line-height: 1;
}
.boot-segments {
justify-self: center;
display: inline-flex;
gap: 8px;
border: 1px solid var(--boot-border);
border-radius: 999px;
padding: 4px;
background: color-mix(in oklab, var(--boot-text) 5%, transparent);
}
.boot-segment {
width: 112px;
height: 30px;
border-radius: 999px;
background: var(--boot-skeleton-base);
}
.boot-actions {
justify-self: end;
display: flex;
gap: 10px;
}
.boot-action {
width: 34px;
height: 34px;
border-radius: 999px;
border: 1px solid var(--boot-border);
background: var(--boot-surface-strong);
}
.boot-content {
display: grid;
gap: 16px;
margin-top: 14px;
}
.boot-panel {
border: 1px solid var(--boot-border);
border-radius: 18px;
background: var(--boot-surface);
padding: 14px;
}
.boot-heading {
height: 30px;
width: min(420px, 78%);
border-radius: 9px;
}
.boot-subheading {
height: 16px;
width: min(300px, 58%);
border-radius: 8px;
margin-top: 10px;
}
.boot-stats {
height: 18px;
width: min(420px, 88%);
border-radius: 8px;
margin-top: 14px;
}
.boot-discovery-mobile {
display: block;
}
.boot-discovery-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 8px;
}
.boot-discovery-tile {
min-height: 120px;
border: 1px solid var(--boot-border);
border-radius: 18px;
background: color-mix(in oklab, var(--boot-text) 3%, transparent);
}
@media (min-width: 1024px) {
.boot-discovery-mobile {
display: none;
}
}
.boot-title {
margin: 0 0 10px;
color: var(--boot-muted);
font-size: 14px;
font-weight: 500;
}
.boot-lines {
display: grid;
gap: 8px;
}
.boot-line {
height: 13px;
border-radius: 7px;
}
.boot-line:nth-child(1) {
width: 93%;
}
.boot-line:nth-child(2) {
width: 88%;
}
.boot-line:nth-child(3) {
width: 82%;
}
.boot-line:nth-child(4) {
width: 90%;
}
.boot-line:nth-child(5) {
width: 74%;
}
.boot-date-strip {
display: flex;
gap: 8px;
overflow: hidden;
}
.boot-date-pill {
width: 60px;
height: 88px;
border-radius: 12px;
flex: 0 0 auto;
}
.boot-controls {
display: grid;
gap: 10px;
}
.boot-search {
height: 48px;
border-radius: 40px;
}
.boot-filters {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.boot-chip {
height: 28px;
border-radius: 999px;
min-width: 90px;
}
.boot-toolbar {
display: flex;
justify-content: space-between;
align-items: center;
gap: 10px;
}
.boot-view-toggle {
display: inline-flex;
gap: 8px;
}
.boot-view-btn {
width: 38px;
height: 32px;
border-radius: 10px;
}
.boot-cards {
columns: 2;
column-gap: 12px;
}
.boot-card {
break-inside: avoid;
margin-bottom: 12px;
border: 1px solid var(--boot-border);
border-radius: 18px;
padding: 0;
display: block;
overflow: hidden;
background: color-mix(in oklab, var(--boot-text) 3%, transparent);
}
.boot-card-cover {
aspect-ratio: 0.94;
width: 100%;
border-radius: 0;
}
.boot-card-lines {
display: grid;
gap: 8px;
padding: 12px;
}
.boot-card-line {
height: 12px;
border-radius: 6px;
}
.boot-card-line:nth-child(1) {
width: 80%;
}
.boot-card-line:nth-child(2) {
width: 95%;
}
.boot-card-line:nth-child(3) {
width: 68%;
}
.boot-skeleton {
position: relative;
background: var(--boot-skeleton-base);
overflow: hidden;
}
.boot-skeleton::after {
content: "";
position: absolute;
inset: 0;
transform: translateX(-100%);
background: linear-gradient(
90deg,
transparent 0%,
var(--boot-skeleton-shine) 45%,
transparent 100%
);
animation: boot-shimmer 1.6s ease-in-out infinite;
}
@keyframes boot-shimmer {
to {
transform: translateX(100%);
}
}
@media (max-width: 960px) {
.boot-header {
grid-template-columns: 1fr auto;
grid-template-areas:
"brand actions"
"segments segments";
}
.boot-brand {
grid-area: brand;
}
.boot-actions {
grid-area: actions;
}
.boot-segments {
grid-area: segments;
justify-self: start;
}
}
@media (max-width: 700px) {
.boot-shell {
width: calc(100% - 18px);
padding-top: 10px;
}
.boot-header {
border-radius: 14px;
padding: 10px 10px;
gap: 10px;
}
.boot-segment {
width: 96px;
height: 28px;
}
.boot-panel {
border-radius: 14px;
padding: 11px;
}
.boot-card {
grid-template-columns: 1fr;
gap: 10px;
padding: 10px;
}
.boot-card-cover {
height: 112px;
}
.boot-view-btn {
width: 34px;
height: 30px;
}
}
#networkBootFallback[hidden] {
display: none !important;
}
</style>
<script type="module" crossorigin src="/assets/index.js"></script>
<link rel="modulepreload" crossorigin href="/assets/chunk-vendor-router-1-10-1-1f9930f.js">
<link rel="modulepreload" crossorigin href="/assets/chunk-vendor-supabase-1-10-1-1f9930f.js">
<link rel="stylesheet" crossorigin href="/assets/index.css?v=1.10.1%2B1f9930f">
</head>
<body>
<noscript>
<div>
<img
src="https://mc.yandex.ru/watch/106630808"
style="position: absolute; left: -9999px"
alt=""
/>
</div>
</noscript>
<div id="networkBootFallback" role="status" aria-live="polite">
<p class="boot-sr-only">Подгружаем актуальные события</p>
<div class="boot-shell" aria-hidden="true">
<header class="boot-header">
<span class="boot-brand">дизайн-афиша</span>
<div class="boot-segments">
<span class="boot-segment boot-skeleton"></span>
<span class="boot-segment boot-skeleton"></span>
</div>
<div class="boot-actions">
<span class="boot-action boot-skeleton"></span>
<span class="boot-action boot-skeleton"></span>
<span class="boot-action boot-skeleton"></span>
</div>
</header>
<main class="boot-content">
<section class="boot-panel">
<div class="boot-heading boot-skeleton"></div>
<div class="boot-subheading boot-skeleton"></div>
<div class="boot-stats boot-skeleton"></div>
</section>
<section class="boot-panel boot-discovery-mobile">
<div class="boot-discovery-grid">
<span class="boot-discovery-tile boot-skeleton"></span>
<span class="boot-discovery-tile boot-skeleton"></span>
<span class="boot-discovery-tile boot-skeleton"></span>
</div>
</section>
<section class="boot-panel">
<p class="boot-title">Популярное сейчас</p>
<div class="boot-lines">
<div class="boot-line boot-skeleton"></div>
<div class="boot-line boot-skeleton"></div>
<div class="boot-line boot-skeleton"></div>
<div class="boot-line boot-skeleton"></div>
<div class="boot-line boot-skeleton"></div>
</div>
</section>
<section class="boot-panel">
<div class="boot-date-strip">
<span class="boot-date-pill boot-skeleton"></span>
<span class="boot-date-pill boot-skeleton"></span>
<span class="boot-date-pill boot-skeleton"></span>
<span class="boot-date-pill boot-skeleton"></span>
<span class="boot-date-pill boot-skeleton"></span>
</div>
</section>
<section class="boot-panel boot-controls">
<div class="boot-search boot-skeleton"></div>
<div class="boot-toolbar">
<div class="boot-filters">
<span class="boot-chip boot-skeleton"></span>
<span class="boot-chip boot-skeleton"></span>
<span class="boot-chip boot-skeleton"></span>
</div>
<div class="boot-view-toggle">
<span class="boot-view-btn boot-skeleton"></span>
<span class="boot-view-btn boot-skeleton"></span>
</div>
</div>
</section>
<section class="boot-cards">
<article class="boot-card">
<div class="boot-card-cover boot-skeleton"></div>
<div class="boot-card-lines">
<div class="boot-card-line boot-skeleton"></div>
<div class="boot-card-line boot-skeleton"></div>
<div class="boot-card-line boot-skeleton"></div>
</div>
</article>
<article class="boot-card">
<div class="boot-card-cover boot-skeleton"></div>
<div class="boot-card-lines">
<div class="boot-card-line boot-skeleton"></div>
<div class="boot-card-line boot-skeleton"></div>
<div class="boot-card-line boot-skeleton"></div>
</div>
</article>
<article class="boot-card">
<div class="boot-card-cover boot-skeleton"></div>
<div class="boot-card-lines">
<div class="boot-card-line boot-skeleton"></div>
<div class="boot-card-line boot-skeleton"></div>
<div class="boot-card-line boot-skeleton"></div>
</div>
</article>
</section>
</main>
</div>
</div>
<div id="root" translate="no" class="notranslate"></div>
</body>
</html>