Найден корректный robots.txt
Файл управления сканированием сайта роботами
?
Robots.txt указывает поисковым роботам, какие страницы сканировать, а какие — нет. Ошибки в файле могут случайно закрыть важные разделы от индексации.
Кол-во редиректов для файла robots.txt 4 слишком большое! Это может вызывать затруднение при индексации поисковыми роботами!
Проверяемая страница не запрещена в robots.txt.
Цепочка редиректов для файла robots.txt:
http://e-mea.ru/robots.txt
301 MovedPermanently
https://e-mea.ru/robots.txt
301 MovedPermanently
https://e-mea.ru/portal/
302 Found
https://e-mea.ru/portal/auth/login
200 OK
Показать содержимое robots.txt
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Вход — Портал</title>
<link rel="stylesheet" href="https://e-mea.ru/portal/static/style.css">
</head>
<body class="auth-page">
<div class="auth-theme-btn">
<button class="btn-theme" id="themeToggle" title="Переключить тему" aria-label="Переключить тему">
<svg class="icon-sun" viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2">
<circle cx="12" cy="12" r="5"/>
<line x1="12" y1="1" x2="12" y2="3"/><line x1="12" y1="21" x2="12" y2="23"/>
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"/><line x1="18.36" y1="18.36" x2="19.78" y2="19.78"/>
<line x1="1" y1="12" x2="3" y2="12"/><line x1="21" y1="12" x2="23" y2="12"/>
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"/><line x1="18.36" y1="5.64" x2="19.78" y2="4.22"/>
</svg>
<svg class="icon-moon" viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2">
<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/>
</svg>
</button>
</div>
<div class="auth-container">
<div class="auth-card">
<div class="auth-header">
<div class="auth-icon">
<svg viewBox="0 0 24 24" width="48" height="48" fill="none" stroke="currentColor" stroke-width="1.5">
<circle cx="12" cy="12" r="3"/>
<path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83-2.83l.06-.06A1.65 1.65 0 0 0 4.68 15a1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 2.83-2.83l.06.06A1.65 1.65 0 0 0 9 4.68a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 2.83l-.06.06A1.65 1.65 0 0 0 19.4 9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z"/>
</svg>
</div>
<h1>Портал авторизации</h1>
<p>Войдите в систему для доступа к сервисам</p>
</div>
<form class="auth-form" id="loginForm">
<div class="form-group">
<label for="username">Имя пользователя</label>
<input type="text" id="username" name="username" placeholder="admin" required autofocus>
</div>
<div class="form-group">
<label for="password">Пароль</label>
<div class="password-wrapper">
<input type="password" id="password" name="password" placeholder="••••••••" required>
<button type="button" class="password-toggle" onclick="togglePassword('password', this)" tabindex="-1" aria-label="Показать/скрыть пароль">
<svg class="eye-icon" viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2">
<path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"/>
<circle cx="12" cy="12" r="3"/>
</svg>
<svg class="eye-off-icon" viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" style="display:none;">
<path d="M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24"/>
<line x1="1" y1="1" x2="23" y2="23"/>
</svg>
</button>
</div>
</div>
<div class="form-error" id="formError"></div>
<button type="submit" class="btn-primary">
<span class="btn-text">Войти</span>
<span class="btn-loader">
<svg viewBox="0 0 24 24" width="20" height="20" fill="none" stroke="currentColor" stroke-width="2">
<circle cx="12" cy="12" r="10" stroke-dasharray="31.4 31.4" stroke-linecap="round"/>
</svg>
</span>
</button>
</form>
</div>
<div class="auth-footer">
<p>Portal v1.0</p>
</div>
</div>
<script>
// Переключение темы
(function() {
const html = document.documentElement;
const btn = document.getElementById('themeToggle');
const saved = localStorage.getItem('portal-theme');
const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
if (saved === 'dark' || (!saved && prefersDark)) {
html.setAttribute('data-theme', 'dark');
} else {
html.setAttribute('data-theme', 'light');
}
if (btn) {
btn.addEventListener('click', function() {
const isDark = html.getAttribute('data-theme') === 'dark';
if (isDark) {
html.setAttribute('data-theme', 'light');
localStorage.setItem('portal-theme', 'light');
} else {
html.setAttribute('data-theme', 'dark');
localStorage.setItem('portal-theme', 'dark');
}
});
}
})();
// AJAX-логин
document.getElementById('loginForm').addEventListener('submit', async function(e) {
e.preventDefault();
const form = e.target;
const btn = form.querySelector('button[type="submit"]');
const btnText = btn.querySelector('.btn-text');
const btnLoader = btn.querySelector('.btn-loader');
const errorEl = document.getElementById('formError');
btn.disabled = true;
btnText.style.display = 'none';
btnLoader.style.display = 'inline-flex';
errorEl.style.display = 'none';
try {
const formData = new FormData(form);
const data = {
username: formData.get('username'),
password: formData.get('password')
};
const response = await fetch('/portal/auth/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data)
});
const result = await response.json();
if (!response.ok) {
errorEl.textContent = result.detail || 'Ошибка входа';
errorEl.style.display = 'block';
} else if (result.access_token && result.redirect) {
window.location.href = result.redirect;
}
} catch (err) {
errorEl.textContent = 'Ошибка соединения с сервером';
errorEl.style.display = 'block';
} finally {
btn.disabled = false;
btnText.style.display = 'inline';
btnLoader.style.display = 'none';
}
});
// Переключение видимости пароля
function togglePassword(inputId, btn) {
const input = document.getElementById(inputId);
const isPassword = input.getAttribute('type') === 'password';
input.setAttribute('type', isPassword ? 'text' : 'password');
const eyeIcon = btn.querySelector('.eye-icon');
const eyeOffIcon = btn.querySelector('.eye-off-icon');
if (eyeIcon) eyeIcon.style.display = isPassword ? 'none' : 'inline';
if (eyeOffIcon) eyeOffIcon.style.display = isPassword ? 'inline' : 'none';
}
</script>
</body>
</html>