Найден корректный robots.txt
Файл управления сканированием сайта роботами
?
Robots.txt указывает поисковым роботам, какие страницы сканировать, а какие — нет. Ошибки в файле могут случайно закрыть важные разделы от индексации.
Robots.txt настроен корректно. Размер файла: 18293 байт. Загружен за: 0сек.
Проверяемая страница не запрещена в robots.txt.
Цепочка редиректов для файла robots.txt:
http://crm-rocket.ru/robots.txt
301 MovedPermanently
https://crm-rocket.ru/robots.txt
200 OK
Показать содержимое robots.txt
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="robots" content="noindex">
<title>Rocket Club — CRM заявок</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Unbounded:wght@600;700;800&family=Manrope:wght@400;500;600;700&family=JetBrains+Mono:wght@500;600&display=swap" rel="stylesheet">
<style>
*{margin:0;padding:0;box-sizing:border-box;-webkit-text-size-adjust:100%;text-size-adjust:100%}
:root{--bg:#06080a;--orange:#ff6f02;--orange2:#ff9a3d;--ink:#eef3f1;--mut:rgba(238,243,241,.6);--mut2:rgba(238,243,241,.4);
--bd:rgba(255,255,255,.08);--card:linear-gradient(180deg,rgba(255,255,255,.045),rgba(255,255,255,.015));--green:#36d57d}
html,body{background:var(--bg);color:var(--ink);font-family:'Manrope',sans-serif;min-height:100vh}
body{padding:clamp(16px,3vw,34px);position:relative;overflow-x:hidden}
.glow{position:fixed;border-radius:50%;filter:blur(110px);pointer-events:none;z-index:0;width:600px;height:600px;top:-260px;right:-180px;background:radial-gradient(circle,rgba(255,111,2,.16),transparent 64%)}
.wrap{position:relative;z-index:1;max-width:1180px;margin:0 auto}
.top{display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap;margin-bottom:28px}
.brand{display:flex;align-items:center;gap:13px}
.brand img{height:24px;width:auto;display:block}
.brand .t{font-family:'Unbounded';font-weight:700;font-size:18px}
.brand .s{font-family:'JetBrains Mono',monospace;font-size:11px;letter-spacing:.18em;text-transform:uppercase;color:var(--orange2)}
.actions{display:flex;gap:10px}
.btn{display:inline-flex;align-items:center;gap:8px;background:rgba(255,255,255,.05);border:1px solid var(--bd);color:var(--ink);font-weight:600;font-size:14px;padding:10px 16px;border-radius:11px;cursor:pointer;transition:.2s;text-decoration:none}
.btn:hover{border-color:rgba(255,111,2,.5);background:rgba(255,111,2,.1)}
.btn.pri{background:#ff6f02;border-color:#ff6f02;color:#fff}
.btn.pri:hover{background:#ff8424}
.btn.danger{color:#ff5a5a;border-color:rgba(255,90,90,.4)}
.btn.danger:hover{background:rgba(255,90,90,.12);border-color:#ff5a5a}
.stats{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin-bottom:22px}
.stat{background:var(--card);border:1px solid var(--bd);border-radius:18px;padding:20px 22px}
.stat .n{font-family:'Unbounded';font-weight:800;font-size:32px;letter-spacing:-.02em}
.stat .l{font-size:13px;color:var(--mut);margin-top:4px}
.stat.o .n{color:var(--orange)} .stat.g .n{color:var(--green)}
.bar{display:flex;align-items:center;gap:12px;margin-bottom:16px;flex-wrap:wrap}
.search{flex:1;min-width:200px;position:relative}
.search input{width:100%;background:rgba(255,255,255,.04);border:1px solid var(--bd);border-radius:13px;padding:13px 16px 13px 44px;color:#fff;font-family:'Manrope';font-size:15px;outline:none}
.search input:focus{border-color:#ff6f02}
.search svg{position:absolute;left:15px;top:50%;transform:translateY(-50%);width:18px;height:18px;stroke:var(--mut);fill:none;stroke-width:2}
.cnt{font-size:13px;color:var(--mut2);font-family:'JetBrains Mono',monospace}
.tablewrap{background:var(--card);border:1px solid var(--bd);border-radius:20px;overflow:hidden}
table{width:100%;border-collapse:collapse}
th{text-align:left;font-family:'JetBrains Mono',monospace;font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--mut2);font-weight:600;padding:16px 18px;border-bottom:1px solid var(--bd);white-space:nowrap}
td{padding:14px 18px;border-bottom:1px solid rgba(255,255,255,.05);font-size:14.5px;vertical-align:middle}
tr:last-child td{border-bottom:none}
tbody tr{transition:background .15s;cursor:pointer}
tbody tr:hover{background:rgba(255,111,2,.06)}
.idx{color:var(--mut2);font-family:'JetBrains Mono',monospace;font-size:13px}
.nm{font-weight:600}
.av{display:inline-flex;align-items:center;gap:11px}
.av .c{width:34px;height:34px;border-radius:9px;background:linear-gradient(135deg,rgba(255,111,2,.25),rgba(255,154,61,.12));border:1px solid rgba(255,111,2,.3);display:flex;align-items:center;justify-content:center;font-family:'Unbounded';font-weight:700;font-size:13px;color:var(--orange2);flex:none}
a.lk{color:var(--ink);text-decoration:none;border-bottom:1px dashed rgba(255,255,255,.2)}
a.lk:hover{color:var(--orange2);border-color:var(--orange2)}
.dt{color:var(--mut);font-family:'JetBrains Mono',monospace;font-size:13px;white-space:nowrap}
.bdg{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;font-weight:600;padding:5px 11px;border-radius:100px;white-space:nowrap}
.bdg::before{content:"";width:7px;height:7px;border-radius:50%;background:currentColor}
.bdg.ok{color:var(--green);background:rgba(54,213,125,.12);border:1px solid rgba(54,213,125,.3)}
.bdg.no{color:var(--orange2);background:rgba(255,111,2,.1);border:1px solid rgba(255,111,2,.32)}
.bdg.un{color:var(--mut2);background:rgba(255,255,255,.05);border:1px solid var(--bd)}
.empty,.state{padding:60px 20px;text-align:center;color:var(--mut)}
/* gate */
.gate{position:fixed;inset:0;z-index:60;background:rgba(6,8,10,.94);display:none;align-items:center;justify-content:center;padding:24px}
.gate.on{display:flex}
.gatebox{background:var(--card);border:1px solid var(--bd);border-radius:22px;padding:34px;max-width:380px;width:100%;text-align:center}
.gatebox h2{font-family:'Unbounded';font-weight:700;font-size:22px;margin-bottom:8px}
.gatebox p{font-size:14px;color:var(--mut);margin-bottom:20px}
.gatebox input{width:100%;background:rgba(255,255,255,.05);border:1px solid var(--bd);border-radius:12px;padding:14px 16px;color:#fff;font-size:15px;outline:none;margin-bottom:14px;text-align:center}
.gatebox input:focus{border-color:#ff6f02}
.err{color:#ff5a5a;font-size:13px;margin-bottom:12px;min-height:16px}
/* client card */
.cgate{position:fixed;inset:0;z-index:55;background:rgba(6,8,10,.72);backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);display:none;align-items:center;justify-content:center;padding:20px}
.cgate.on{display:flex}
.ccard{background:#0c0f13;border:1px solid rgba(255,111,2,.22);border-radius:22px;padding:30px;max-width:460px;width:100%;position:relative;box-shadow:0 40px 110px -30px rgba(0,0,0,.85)}
.cclose{position:absolute;top:16px;right:16px;width:34px;height:34px;border-radius:50%;border:1px solid var(--bd);background:rgba(255,255,255,.05);color:#fff;font-size:19px;cursor:pointer}
.chead{display:flex;align-items:center;gap:16px;margin-bottom:24px}
.chead .cav{width:58px;height:58px;border-radius:15px;background:linear-gradient(135deg,#ff6f02,#ff9a3d);display:flex;align-items:center;justify-content:center;font-family:'Unbounded';font-weight:800;font-size:21px;color:#fff;flex:none}
.cname{font-family:'Unbounded';font-weight:700;font-size:22px;margin-bottom:8px}
.crow{display:flex;justify-content:space-between;align-items:center;gap:16px;padding:14px 0;border-bottom:1px solid rgba(255,255,255,.06)}
.crow .cl{font-size:13px;color:var(--mut2);font-family:'JetBrains Mono',monospace;text-transform:uppercase;letter-spacing:.08em}
.crow .cv{font-size:15px;font-weight:600;text-align:right}
.cactions{display:flex;gap:10px;margin-top:24px;flex-wrap:wrap}
.cactions .btn{flex:1;justify-content:center;min-width:120px}
.lbl{display:inline}
/* tablet */
@media(max-width:900px){.stats{grid-template-columns:1fr 1fr}td,th{padding:13px 14px}.stat .n{font-size:27px}}
/* phone — таблица превращается в карточки */
@media(max-width:760px){
body{padding:16px 14px}
.top{margin-bottom:20px}
.brand .t{font-size:16px}
.actions{gap:8px}
.btn{padding:10px 13px;font-size:13px}
.stats{gap:10px;margin-bottom:18px}
.stat{padding:16px 15px;border-radius:15px}
.stat .n{font-size:24px}.stat .l{font-size:12px}
thead{display:none}
table,tbody,tr,td{display:block;width:100%}
.tablewrap{background:transparent;border:none;border-radius:0;overflow:visible}
tbody tr{background:var(--card);border:1px solid var(--bd);border-radius:16px;margin-bottom:12px;padding:4px 2px 8px}
tbody tr:hover{background:var(--card)}
td{border:none!important;padding:9px 16px;display:flex;justify-content:space-between;align-items:center;gap:14px;font-size:14px;text-align:right}
td.idx{display:none}
td.hide-m{display:flex}
td[data-label]::before{content:attr(data-label);font-family:'JetBrains Mono',monospace;font-size:10.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--mut2);flex:none;text-align:left}
td.contact-cell{padding:14px 16px 12px;border-bottom:1px solid rgba(255,255,255,.07)!important;margin-bottom:4px}
td.contact-cell .av{width:100%}
td.dt,td[data-label] a.lk{word-break:break-word}
}
@media(max-width:400px){.lbl{display:none}.btn{padding:11px}}
</style>
</head>
<body>
<div class="glow"></div>
<div class="wrap">
<div class="top">
<div class="brand"><img src="rc-logo.png" alt="RC"><div><div class="t">CRM · Заявки</div><div class="s">Rocket Club</div></div></div>
<div class="actions">
<button class="btn" id="refresh"><svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><path d="M23 4v6h-6M1 20v-6h6"/><path d="M3.5 9a9 9 0 0 1 14.8-3.4L23 10M1 14l4.7 4.4A9 9 0 0 0 20.5 15"/></svg> <span class="lbl">Обновить</span></button>
<button class="btn pri" id="export"><svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="#fff" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4M7 10l5 5 5-5M12 15V3"/></svg> <span class="lbl">Экспорт CSV</span></button>
</div>
</div>
<div class="stats">
<div class="stat o"><div class="n" id="st-total">—</div><div class="l">Всего заявок</div></div>
<div class="stat"><div class="n" id="st-today">—</div><div class="l">Сегодня</div></div>
<div class="stat"><div class="n" id="st-week">—</div><div class="l">За 7 дней</div></div>
<div class="stat g"><div class="n" id="st-mailed">—</div><div class="l">Материалы отправлены</div></div>
</div>
<div class="bar">
<div class="search"><svg viewBox="0 0 24 24"><circle cx="11" cy="11" r="7"/><path d="M21 21l-4.3-4.3"/></svg><input id="q" placeholder="Поиск по имени, телефону, email…"></div>
<div class="cnt" id="shown"></div>
</div>
<div class="tablewrap">
<table>
<thead><tr><th>#</th><th>Контакт</th><th class="hide-m">Телефон</th><th class="hide-m">Email</th><th>Дата</th><th>Материалы</th></tr></thead>
<tbody id="rows"><tr><td colspan="6" class="state">Загрузка…</td></tr></tbody>
</table>
</div>
</div>
<!-- client card -->
<div class="cgate" id="cgate">
<div class="ccard">
<button class="cclose" id="cclose">×</button>
<div class="chead"><div class="cav" id="c-av">—</div><div><div class="cname" id="c-name">—</div><div id="c-badge"></div></div></div>
<div class="crow"><span class="cl">Дата заявки</span><span class="cv" id="c-date"></span></div>
<div class="crow"><span class="cl">Телефон</span><span class="cv"><a class="lk" id="c-phone"></a></span></div>
<div class="crow"><span class="cl">Email</span><span class="cv"><a class="lk" id="c-email"></a></span></div>
<div class="crow"><span class="cl">Материалы на почту</span><span class="cv" id="c-status"></span></div>
<div class="cactions">
<a class="btn pri" id="c-call">Позвонить</a>
<a class="btn" id="c-mail">Написать</a>
<button class="btn danger" id="c-del">Удалить</button>
</div>
</div>
</div>
<!-- access gate -->
<div class="gate" id="gate">
<div class="gatebox">
<h2>Доступ к CRM</h2><p>Введите ключ доступа, чтобы открыть заявки.</p>
<div class="err" id="gerr"></div>
<input id="gkey" type="password" placeholder="Ключ доступа" autocomplete="off">
<button class="btn pri" id="genter" style="width:100%;justify-content:center">Войти</button>
</div>
</div>
<script>
(function(){
var KEY='', DATA=[], CUR=null;
function qs(n){return document.getElementById(n);}
function getKey(){var u=new URLSearchParams(location.search).get('key'); if(u) return u; try{return localStorage.getItem('rc_crm_key')||'';}catch(e){return '';}}
function p2(x){return (x<10?'0':'')+x;}
function fmt(ts){var d=new Date(ts); if(isNaN(d))return ts||''; return p2(d.getDate())+'.'+p2(d.getMonth()+1)+' '+p2(d.getHours())+':'+p2(d.getMinutes());}
function fmtFull(ts){var d=new Date(ts); if(isNaN(d))return ts||''; return p2(d.getDate())+'.'+p2(d.getMonth()+1)+'.'+d.getFullYear()+', '+p2(d.getHours())+':'+p2(d.getMinutes());}
function esc(s){return (s||'').replace(/[&<>"]/g,function(c){return {'&':'&','<':'<','>':'>','"':'"'}[c];});}
function initials(n){n=(n||'').trim(); if(!n)return '?'; var p=n.split(/\s+/); return ((p[0][0]||'')+((p[1]&&p[1][0])||'')).toUpperCase();}
function isToday(ts){var d=new Date(ts),n=new Date(); return d.getFullYear()==n.getFullYear()&&d.getMonth()==n.getMonth()&&d.getDate()==n.getDate();}
function within7(ts){return (Date.now()-new Date(ts).getTime())<7*864e5;}
function badge(m){if(m===true)return '<span class="bdg ok">Отправлено</span>'; if(m===false)return '<span class="bdg no">Не отправлено</span>'; return '<span class="bdg un">—</span>';}
function render(){
var q=(qs('q').value||'').toLowerCase().trim();
var list=DATA.filter(function(r){return !q||((r.name||'')+' '+(r.phone||'')+' '+(r.email||'')).toLowerCase().indexOf(q)>-1;});
qs('st-total').textContent=DATA.length;
qs('st-today').textContent=DATA.filter(function(r){return isToday(r.ts);}).length;
qs('st-week').textContent=DATA.filter(function(r){return within7(r.ts);}).length;
qs('st-mailed').textContent=DATA.filter(function(r){return r.mailed===true;}).length;
qs('shown').textContent=list.length+' из '+DATA.length;
if(!list.length){qs('rows').innerHTML='<tr><td colspan="6" class="empty">'+(DATA.length?'Ничего не найдено':'Пока нет заявок')+'</td></tr>';return;}
qs('rows').innerHTML=list.map(function(r,i){
return '<tr data-ts="'+esc(r.ts)+'">'+
'<td class="idx">'+(i+1)+'</td>'+
'<td class="contact-cell"><span class="av"><span class="c">'+esc(initials(r.name))+'</span><span class="nm">'+(esc(r.name)||'—')+'</span></span></td>'+
'<td class="hide-m" data-label="Телефон">'+(esc(r.phone)||'—')+'</td>'+
'<td class="hide-m" data-label="Email">'+(esc(r.email)||'—')+'</td>'+
'<td class="dt" data-label="Дата">'+fmt(r.ts)+'</td>'+
'<td data-label="Материалы">'+badge(r.mailed)+'</td>'+
'</tr>';}).join('');
}
function openCard(ts){
var r=DATA.filter(function(x){return x.ts===ts;})[0]; if(!r)return; CUR=r;
qs('c-av').textContent=initials(r.name);
qs('c-name').textContent=r.name||'Без имени';
qs('c-badge').innerHTML=badge(r.mailed);
qs('c-date').textContent=fmtFull(r.ts);
qs('c-phone').textContent=r.phone||'—'; qs('c-phone').href='tel:'+(r.phone||'');
qs('c-email').textContent=r.email||'—'; qs('c-email').href='mailto:'+(r.email||'');
qs('c-status').innerHTML = r.mailed===true ? '<span class="bdg ok">Отправлено</span>' : (r.mailed===false?'<span class="bdg no">Не отправлено</span>':'<span class="bdg un">—</span>');
qs('c-call').href='tel:'+(r.phone||''); qs('c-mail').href='mailto:'+(r.email||'');
qs('cgate').className='cgate on';
}
function closeCard(){qs('cgate').className='cgate'; CUR=null;}
function load(){
fetch('/crm/data?key='+encodeURIComponent(KEY)).then(function(r){if(r.status===403){gate(true,'Неверный ключ');return null;}return r.json();})
.then(function(d){if(!d)return; try{localStorage.setItem('rc_crm_key',KEY);}catch(e){} gate(false); DATA=d.leads||[]; render();})
.catch(function(){qs('rows').innerHTML='<tr><td colspan="6" class="state">Ошибка загрузки</td></tr>';});
}
function del(ts){
fetch('/crm/delete',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({key:KEY,ts:ts})})
.then(function(r){return r.json();})
.then(function(d){if(d&&d.ok){DATA=DATA.filter(function(x){return x.ts!==ts;});closeCard();render();}else alert('Не удалось удалить');})
.catch(function(){alert('Ошибка соединения');});
}
function gate(on,msg){qs('gate').className='gate'+(on?' on':''); if(msg!==undefined)qs('gerr').textContent=msg;}
function exportCSV(){
var rows=[['Дата','Имя','Телефон','Email','Материалы отправлены']].concat(DATA.map(function(r){return [r.ts,r.name,r.phone,r.email,r.mailed===true?'да':(r.mailed===false?'нет':'')];}));
var csv=''+rows.map(function(r){return r.map(function(c){return '"'+String(c||'').replace(/"/g,'""')+'"';}).join(';');}).join('\n');
var a=document.createElement('a'); a.href=URL.createObjectURL(new Blob([csv],{type:'text/csv'})); a.download='rocket-leads.csv'; a.click();
}
qs('q').addEventListener('input',render);
qs('rows').addEventListener('click',function(e){var tr=e.target.closest&&e.target.closest('tr[data-ts]'); if(tr)openCard(tr.getAttribute('data-ts'));});
qs('cclose').addEventListener('click',closeCard);
qs('cgate').addEventListener('click',function(e){if(e.target===qs('cgate'))closeCard();});
qs('c-del').addEventListener('click',function(){if(CUR&&confirm('Удалить заявку «'+(CUR.name||'')+'» безвозвратно?'))del(CUR.ts);});
document.addEventListener('keydown',function(e){if(e.key==='Escape')closeCard();});
qs('refresh').addEventListener('click',load);
qs('export').addEventListener('click',exportCSV);
qs('genter').addEventListener('click',function(){KEY=qs('gkey').value.trim(); if(KEY)load();});
qs('gkey').addEventListener('keydown',function(e){if(e.key==='Enter'){KEY=qs('gkey').value.trim(); if(KEY)load();}});
KEY=getKey(); if(KEY)load(); else gate(true,'');
setInterval(function(){if(KEY && !qs('gate').classList.contains('on') && !qs('cgate').classList.contains('on'))load();},30000);
})();
</script>
</body>
</html>