Найден корректный robots.txt
Файл управления сканированием сайта роботами
?
Robots.txt указывает поисковым роботам, какие страницы сканировать, а какие — нет. Ошибки в файле могут случайно закрыть важные разделы от индексации.
Robots.txt настроен корректно. Размер файла: 9626 байт. Загружен за: 78мсек.
Проверяемая страница не запрещена в robots.txt.
Показать содержимое robots.txt
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>GrowthLoop — рабочее место преподавателя</title>
<link rel="icon" href="/favicon.svg" type="image/svg+xml">
<style>
[hidden]{display:none!important}
html,body{margin:0;background:#f4f5f8;color:#14161d;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif}
#gate:not([hidden]){position:fixed;inset:0;z-index:100;background:#f4f5f8;overflow:auto;padding:24px}
.gate-card{max-width:400px;margin:8vh auto;background:#fff;padding:24px;border-radius:12px;border:1px solid #e6e8ee}
.gate-input{display:block;width:100%;box-sizing:border-box;margin:6px 0 12px;padding:10px;border:1px solid #e6e8ee;border-radius:8px}
.btn-primary{background:#4f46e5;color:#fff;border:0;border-radius:8px;padding:10px 16px}
.topbar,.subhead,.main{padding:14px 20px}
.page-title{font-size:1.4rem;margin:0}
</style>
<link rel="stylesheet" href="/css/styles.a.css?v=20260814g">
<link rel="stylesheet" href="/css/styles.b.css?v=20260814g">
</head>
<body>
<div id="gate" class="gate" hidden>
<div class="gate-card">
<p class="gate-brand">∞ GrowthLoop</p>
<h1 class="gate-title">Кабинет преподавателя</h1>
<p class="gate-hint">У каждого учителя свои материалы и ученики.</p>
<div class="auth-tabs" role="tablist">
<button type="button" class="auth-tab active" id="auth-tab-login">Вход</button>
<button type="button" class="auth-tab" id="auth-tab-register">Регистрация</button>
</div>
<form id="login-form" class="auth-panel" autocomplete="on">
<label class="gate-label" for="login-email">Email</label>
<input id="login-email" class="gate-input" type="email" name="email" autocomplete="username" required placeholder="name@mail.ru">
<label class="gate-label" for="login-password">Пароль</label>
<input id="login-password" class="gate-input" type="password" name="password" autocomplete="current-password" required placeholder="Пароль">
<button type="submit" class="btn btn-primary gate-submit">Войти</button>
</form>
<form id="register-form" class="auth-panel" hidden autocomplete="on">
<label class="gate-label" for="register-name">Имя</label>
<input id="register-name" class="gate-input" type="text" name="name" autocomplete="name" placeholder="Как к вам обращаться">
<label class="gate-label" for="register-email">Email</label>
<input id="register-email" class="gate-input" type="email" name="email" autocomplete="username" required placeholder="name@mail.ru">
<label class="gate-label" for="register-password">Пароль</label>
<input id="register-password" class="gate-input" type="password" name="password" autocomplete="new-password" required placeholder="Минимум 8 символов" minlength="8">
<p class="gate-password-hint">Пароль: не меньше 8 символов, хотя бы одна буква и одна цифра.</p>
<div id="invite-wrap" hidden>
<label class="gate-label" for="register-invite">Код приглашения</label>
<input id="register-invite" class="gate-input" type="password" name="invite" autocomplete="off" placeholder="Код от организатора пилота">
</div>
<button type="submit" class="btn btn-primary gate-submit">Создать аккаунт</button>
</form>
<p id="gate-error" class="gate-error" hidden></p>
<p class="gate-help-link"><a href="/help.html" target="_blank" rel="noopener">Как работать с GrowthLoop →</a></p>
</div>
</div>
<div class="app-shell" id="app-shell">
<header class="topbar">
<div class="brand">
<span class="brand-mark">∞</span>
<span class="brand-name">GrowthLoop</span>
<span class="brand-sub" id="brand-sub">Рабочее место преподавателя</span>
</div>
<nav class="tab-switch" id="tab-switch" role="tablist" aria-label="Раздел">
<button type="button" class="tab-btn active" data-tab="materials" role="tab" aria-selected="true">Материалы</button>
<button type="button" class="tab-btn" data-tab="students" role="tab" aria-selected="false">Ученики</button>
</nav>
<div class="topbar-user" id="topbar-user" hidden>
<a class="topbar-help" href="/help.html" target="_blank" rel="noopener">Инструкция</a>
<span class="topbar-email" id="topbar-email"></span>
<button type="button" class="btn btn-ghost" id="btn-logout">Выйти</button>
</div>
</header>
<div class="subhead">
<button type="button" class="btn-back hidden" id="btn-back" aria-label="Назад">← Назад</button>
<h1 class="page-title" id="page-title">Материалы</h1>
<div class="page-actions" id="page-actions"></div>
</div>
<main class="main" id="app-root"><p style="padding:24px">Загрузка GrowthLoop…</p></main>
</div>
<!-- Приложение грузится модулями: если один файл не доехал, не выполнится ни один
и страница останется статичной. Показываем это явно, а не молча. -->
<div id="boot-fail" style="display:none;position:fixed;inset:0;z-index:9999;background:#f4f5f8;padding:24px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif">
<div style="max-width:420px;margin:15vh auto;background:#fff;border:1px solid #e6e8ee;border-radius:12px;padding:24px;text-align:center">
<p style="font-size:1.05rem;font-weight:600;margin:0 0 8px">Приложение не загрузилось</p>
<p style="color:#6b7280;font-size:0.9rem;line-height:1.5;margin:0 0 12px">Часть файлов не дошла из-за связи. Данные в порядке — нужно просто загрузить страницу заново.</p>
<p id="boot-fail-detail" style="color:#9ca3af;font-size:0.75rem;line-height:1.4;margin:0 0 18px;word-break:break-word"></p>
<button type="button" onclick="location.reload()" style="background:#4f46e5;color:#fff;border:none;border-radius:8px;padding:11px 20px;font-size:0.95rem;cursor:pointer">Обновить страницу</button>
</div>
</div>
<script>
function showBootFail(reason) {
if (window.__loopBooted) return;
var el = document.getElementById('boot-fail');
if (el) el.style.display = 'block';
var detail = document.getElementById('boot-fail-detail');
if (detail && reason) detail.textContent = String(reason).slice(0, 240);
try {
var anon = localStorage.getItem('loop-anon');
if (!anon) {
anon = 'anon_' + Date.now() + '_' + Math.random().toString(36).slice(2, 8);
localStorage.setItem('loop-anon', anon);
}
var payload = JSON.stringify({
anonId: anon,
sessionId: 'boot_' + Date.now(),
events: [{
type: 'boot_fail',
ts: new Date().toISOString(),
data: {
reason: reason ? String(reason).slice(0, 200) : 'modules_timeout',
path: location.pathname + location.search,
href: location.href
}
}]
});
var blob = new Blob([payload], { type: 'application/json' });
if (!(navigator.sendBeacon && navigator.sendBeacon('/api/log', blob))) {
fetch('/api/log', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: payload,
keepalive: true
}).catch(function () {});
}
} catch (e) { /* ignore */ }
}
var bootTimer = setTimeout(function () {
showBootFail(window.__loopBootError || 'modules_timeout');
}, 90000);
window.__loopClearBootTimer = function () { clearTimeout(bootTimer); };
</script>
<script>
(function () {
var N = 8;
var V = '20260814h';
var parts = [];
function status(msg) {
var el = document.getElementById('app-root');
if (el) el.innerHTML = '<p style="padding:24px">' + msg + '</p>';
}
function fail(msg) {
window.__loopBootError = msg;
if (typeof showBootFail === 'function') showBootFail(msg);
}
function run() {
var code = parts.join('');
if (code.length < 40000) throw new Error('bundle short: ' + code.length);
try { eval(code); } catch (err) {
var s = document.createElement('script');
s.text = code;
document.body.appendChild(s);
}
if (!window.__loopBooted) throw new Error('app did not boot, len=' + code.length);
if (window.__loopClearBootTimer) window.__loopClearBootTimer();
}
function loadOne(i, attempt) {
status('Загрузка ' + (i + 1) + '/' + N);
var x = new XMLHttpRequest();
var done = false;
var timer = setTimeout(function () {
if (done) return;
done = true;
x.abort();
if (attempt < 2) loadOne(i, attempt + 1);
else fail('timeout b' + i + '.txt');
}, 8000);
x.open('GET', '/js/chunks/b' + i + '.txt?v=' + V, true);
x.onreadystatechange = function () {
if (x.readyState !== 4 || done) return;
done = true;
clearTimeout(timer);
if (x.status !== 200) {
if (attempt < 2) loadOne(i, attempt + 1);
else fail('chunk b' + i + ' HTTP ' + x.status);
return;
}
parts[i] = x.responseText;
if (i + 1 < N) loadOne(i + 1, 0);
else {
try { run(); }
catch (err) { fail(err && err.message ? err.message : String(err)); }
}
};
x.send();
}
loadOne(0, 0);
})();
</script>
</body>
</html>