feat: SEO — meta tags, keywords, SSR vendors, robots.txt, sitemap.xml, Schema.org

This commit is contained in:
2026-05-15 15:42:49 +03:00
parent c80492315a
commit 61f1338405
2 changed files with 79 additions and 3 deletions
+38 -2
View File
@@ -3,12 +3,39 @@
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Корзина МОНТ</title> <title>Вендоры МОНТ — матрица продуктов и категорий дистрибьютора MONT</title>
<meta name="description" content="Корзина продуктов МОНТ: актуальная матрица вендоров, категорий и продуктовых линеек дистрибьютора MONT. Инфраструктура и информационная безопасность. МОНТ Казань, Москва." />
<meta name="keywords" content="вендоры МОНТ, вендоры MONT, дистрибьютор МОНТ, корзина продуктов МОНТ, матрица МОНТ, МОНТ Казань, партнёры МОНТ, ИБ вендоры, инфраструктура ПО, MONT vendor map" />
<meta name="robots" content="index, follow" />
<link rel="canonical" href="{{ canonical_url }}" />
<!-- Open Graph -->
<meta property="og:type" content="website" />
<meta property="og:url" content="{{ canonical_url }}" />
<meta property="og:title" content="Вендоры МОНТ — матрица продуктов и категорий" />
<meta property="og:description" content="Актуальная матрица вендоров и продуктов дистрибьютора МОНТ. Инфраструктура и информационная безопасность." />
<meta property="og:image" content="{{ canonical_url }}/static/mont_logo.png" />
<meta property="og:locale" content="ru_RU" />
<!-- Schema.org Organization -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "МОНТ",
"alternateName": "MONT",
"description": "Дистрибьютор программного обеспечения. Корзина продуктов: вендоры, категории, продуктовые линейки в сфере инфраструктуры и информационной безопасности.",
"url": "{{ canonical_url }}",
"logo": "{{ canonical_url }}/static/mont_logo.png",
"sameAs": ["https://www.mont.com"]
}
</script>
<link rel="icon" type="image/png" href="/static/favicon.png" /> <link rel="icon" type="image/png" href="/static/favicon.png" />
<link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Caveat:wght@600;700&family=Manrope:wght@400;600;700;800&family=Space+Grotesk:wght@500;700&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=Caveat:wght@600;700&family=Manrope:wght@400;600;700;800&family=Space+Grotesk:wght@500;700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="{{ url_for('static', filename='css/index.css') }}" /> <link rel="stylesheet" href="{{ url_for('static', filename='css/index.css') }}" />
</head> </head>
<body> <body>
<main class="wrap"> <main class="wrap">
@@ -34,6 +61,15 @@
</div> </div>
</section> </section>
<!-- SSR-контент для поисковых роботов -->
<div style="position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;" aria-hidden="true">
<h2>Вендоры дистрибьютора МОНТ (MONT)</h2>
<p>Матрица вендоров, продуктов и категорий компании МОНТ — ведущего дистрибьютора программного обеспечения в России. Инфраструктура и информационная безопасность.</p>
<ul>{% for v in ssr_vendors %}<li>{{ v }}</li>{% endfor %}</ul>
<h2>Категории продуктов МОНТ</h2>
<ul>{% for c in ssr_categories %}<li>{{ c }}</li>{% endfor %}</ul>
</div>
<section class="board"> <section class="board">
<article class="card"> <article class="card">
<div class="card-header"><h2>Вендоры</h2><span class="count-badge" id="vendorBadge">...</span></div> <div class="card-header"><h2>Вендоры</h2><span class="count-badge" id="vendorBadge">...</span></div>
+41 -1
View File
@@ -548,7 +548,47 @@ def apply_pending_overlay(
@bp.get("/") @bp.get("/")
def index(): def index():
return render_template("index.html") conn = get_db()
ssr_vendors = [r[0] for r in conn.execute("SELECT name FROM vendors ORDER BY lower(name)")]
ssr_categories = [r[0] for r in conn.execute(
"SELECT name FROM (SELECT name FROM categories UNION SELECT name FROM ib_categories) ORDER BY lower(name)"
)]
conn.close()
proto = request.headers.get("X-Forwarded-Proto", "https")
canonical_url = f"{proto}://{request.host}"
return render_template("index.html",
ssr_vendors=ssr_vendors,
ssr_categories=ssr_categories,
canonical_url=canonical_url,
)
@bp.get("/robots.txt")
def robots_txt():
from flask import Response
body = (
"User-agent: *\n"
"Allow: /\n"
f"Disallow: {ADMIN_PATH}\n"
"Disallow: /sdjlkfhsjkadahjksdhjgfkhsssssdjkjfljsdfjklsdajfkldsjflksdjfkldsj\n"
"\n"
f"Sitemap: https://{{host}}/sitemap.xml\n"
).replace("{host}", request.host)
return Response(body, mimetype="text/plain")
@bp.get("/sitemap.xml")
def sitemap_xml():
from flask import Response
proto = request.headers.get("X-Forwarded-Proto", "https")
base = f"{proto}://{request.host}"
body = (
'<?xml version="1.0" encoding="UTF-8"?>\n'
'<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n'
f' <url><loc>{base}/</loc><changefreq>weekly</changefreq><priority>1.0</priority></url>\n'
'</urlset>'
)
return Response(body, mimetype="application/xml")
@bp.get("/api/data") @bp.get("/api/data")