Найден корректный robots.txt
Файл управления сканированием сайта роботами
?
Robots.txt указывает поисковым роботам, какие страницы сканировать, а какие — нет. Ошибки в файле могут случайно закрыть важные разделы от индексации.
Robots.txt настроен корректно. Размер файла: 21445 байт. Загружен за: 1сек.
Проверяемая страница не запрещена в robots.txt.
Цепочка редиректов для файла robots.txt:
http://miag-engineering.com/robots.txt
301 MovedPermanently
https://miag-engineering.com/robots.txt
200 OK
Показать содержимое robots.txt
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8">
<title>MIAG Engineering GmbH: Ihr Partner in der Region Baden</title>
<meta name="viewport" content="width=device-width,initial-scale=1">
<base href="/">
<script>window.MIAG_URL_ROOT = '/';</script>
<meta name="description" content="Engineering, Qualitätssicherung, Schweisstechnik, Projektmanagement, Field-Service, Waste Management sowie Rückbau und Instandhaltung industrieller Anlagen">
<meta property="og:title" content="MIAG Engineering GmbH: Ihr Partner in der Region Baden">
<meta property="og:description" content="Engineering, Qualitätssicherung, Schweisstechnik, Projektmanagement, Field-Service, Waste Management sowie Rückbau und Instandhaltung industrieller Anlagen">
<meta property="og:type" content="website">
<meta property="og:image" content="https://www.miag-engineering.com/assets/logo-seo.png">
<meta property="og:url" content="https://www.miag-engineering.com/">
<link rel="icon" href="favicon-32.png" type="image/png" sizes="32x32">
<link rel="icon" href="favicon-96.png" type="image/png" sizes="96x96">
<link rel="icon" href="favicon-192.png" type="image/png" sizes="192x192">
<link rel="icon" href="favicon.png" type="image/png" sizes="512x512">
<link rel="apple-touch-icon" href="apple-touch-icon.png">
<script type="application/ld+json">{"@context":"https://schema.org","@type":"Organization","name":"MIAG Engineering GmbH","url":"https://www.miag-engineering.com/","logo":"https://www.miag-engineering.com/assets/logo-seo.png","image":"https://www.miag-engineering.com/assets/logo-seo.png","email":"info@miag-engineering.com","telephone":"+41565520750","description":"Engineering, Qualitätssicherung, Schweisstechnik, Projektmanagement, Field-Service, Waste Management sowie Rückbau und Instandhaltung industrieller Anlagen","sameAs":["https://www.linkedin.com/company/miag-engineering"]}</script>
<link rel="stylesheet" href="colors_and_type.css">
<style>
html, body { margin: 0; padding: 0; background: #fff; }
* { box-sizing: border-box; }
/* Nav anchors should not carry the default-underline link styling
from colors_and_type.css */
header a, footer a, nav a { border-bottom: 0 !important; }
/* Hide page scrollbar while keeping scroll behavior smooth */
html { scroll-behavior: smooth; }
/* Prevent any layout from blowing past the viewport */
body { overflow-x: hidden; }
/* Long compound words must never push a column past its container */
h1, h2, h3, p, li, span, a, div { overflow-wrap: break-word; }
/* Phone-sized headline scale (iPhone-Breite): sonst sprengt ein einzelnes
langes Wort wie "Anspruchsvolle" die Spalte */
@media (max-width: 620px) {
h1 { font-size: clamp(27px, 8.4vw, 40px) !important; }
h2 { font-size: clamp(22px, 6.6vw, 30px) !important; }
}
/* Telefon- und E-Mail-Links: klickbar UND mit der Maus markierbar (Kopieren) */
a[href^="tel:"], a[href^="mailto:"] { user-select: text; -webkit-user-select: text; -webkit-user-drag: none; }
</style>
<script src="https://unpkg.com/react@18.3.1/umd/react.development.js" integrity="sha384-hD6/rw4ppMLGNu3tX5cjIb+uRZ7UkRJ6BPkLpg4hAu/6onKUg4lLsHAs9EBPT82L" crossorigin="anonymous"></script>
<script src="https://unpkg.com/react-dom@18.3.1/umd/react-dom.development.js" integrity="sha384-u6aeetuaXnQ38mYT8rp6sbXaQe3NL9t+IBXmnYxwkUI2Hw4bsp2Wvmx4yRQF1uAm" crossorigin="anonymous"></script>
<script src="https://unpkg.com/@babel/standalone@7.29.0/babel.min.js" integrity="sha384-m08KidiNqLdpJqLq95G/LEi8Qvjl/xUYll3QILypMoQ65QorJ9Lvtp2RXYGBFj1y" crossorigin="anonymous"></script>
<!-- Real-globe rendering: d3-geo needs d3-array as peer; topojson-client parses world atlas -->
<script src="https://unpkg.com/d3-array@3.2.4/dist/d3-array.min.js"></script>
<script src="https://unpkg.com/d3-geo@3.1.1/dist/d3-geo.min.js"></script>
<script src="https://unpkg.com/topojson-client@3.1.0/dist/topojson-client.min.js"></script>
</head>
<body>
<div id="app"></div>
<template id="__bundler_thumbnail"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><rect width="100" height="100" fill="#0d2a4a"/><text x="50" y="59" font-family="Helvetica,Arial,sans-serif" font-size="22" font-weight="700" fill="#fff" text-anchor="middle" letter-spacing="1">MIAG</text></svg></template>
<script src="components/i18n.js"></script>
<script src="components/i18n-dict-a.js"></script>
<script src="components/i18n-dict-b.js"></script>
<script src="components/i18n-dict-c.js"></script>
<script src="components/i18n-dict-d.js"></script>
<script src="components/i18n-fr-a.js"></script>
<script src="components/i18n-fr-b.js"></script>
<script src="components/i18n-fr-c.js"></script>
<script src="components/i18n-fr-d.js"></script>
<script src="components/i18n-it-a.js"></script>
<script src="components/i18n-it-b.js"></script>
<script src="components/i18n-it-c.js"></script>
<script src="components/i18n-it-d.js"></script>
<script src="components/i18n-nl-a.js"></script>
<script src="components/i18n-nl-b.js"></script>
<script src="components/i18n-nl-c.js"></script>
<script src="components/i18n-nl-d.js"></script>
<script src="components/i18n-pl-a.js"></script>
<script src="components/i18n-pl-b.js"></script>
<script src="components/i18n-pl-c.js"></script>
<script src="components/i18n-pl-d.js"></script>
<script type="text/babel" src="components/Primitives.jsx"></script>
<script type="text/babel" src="components/HeroVisuals.jsx"></script>
<script type="text/babel" src="components/Logos.jsx"></script>
<script type="text/babel" src="components/tweaks-panel.jsx"></script>
<script type="text/babel" src="components/Header.jsx"></script>
<script type="text/babel" src="components/Footer.jsx"></script>
<script type="text/babel" src="components/Accessibility.jsx"></script>
<script type="text/babel" src="components/pages/Home.jsx"></script>
<script type="text/babel" src="components/pages/Leistungen.jsx"></script>
<script type="text/babel" src="components/pages/Branchen.jsx"></script>
<script type="text/babel" src="components/pages/Referenzen.jsx"></script>
<script type="text/babel" src="components/pages/Team.jsx"></script>
<script type="text/babel" src="components/pages/Karriere.jsx"></script>
<script type="text/babel" src="components/pages/Blog.jsx"></script>
<script type="text/babel" src="components/pages/Kontakt.jsx"></script>
<script type="text/babel" src="components/pages/Projektanfrage.jsx"></script>
<script type="text/babel" src="components/pages/Bewerbung.jsx"></script>
<script type="text/babel" src="components/pages/Freelancer.jsx"></script>
<script type="text/babel">
const { useState, useEffect } = React;
const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
"accent": "#d4710f",
"heroStyle": "blueprint",
"density": "regular",
"showDraftMarks": true,
"animations": true
}/*EDITMODE-END*/;
const ROUTES = [
'/', '/leistungen', '/branchen', '/referenzen',
'/team', '/karriere', '/blog', '/kontakt',
'/projektanfrage', '/bewerbung', '/freelancer',
];
const ROUTE_LABELS = {
'/': '01 Home',
'/leistungen': '02 Leistungen',
'/branchen': '03 Branchen',
'/referenzen': '04 Referenzen',
'/team': '05 Team',
'/karriere': '06 Karriere',
'/blog': '07 Blog',
'/kontakt': '08 Kontakt',
'/projektanfrage': '09 Projektanfrage',
'/bewerbung': '10 Bewerbung',
'/freelancer': '11 Lieferantenpool',
};
const LANG_CODES = ['DE', 'EN', 'FR', 'IT', 'PL', 'NL'];
/* Seiten-Slugs pro Sprache: die Adresse spricht die Sprache der Seite. */
const ROUTE_SLUGS = {
'/': { DE: '', EN: '', FR: '', IT: '', PL: '', NL: '' },
'/leistungen': { DE: 'leistungen', EN: 'services', FR: 'prestations', IT: 'servizi', PL: 'uslugi', NL: 'diensten' },
'/branchen': { DE: 'branchen', EN: 'industries', FR: 'secteurs', IT: 'settori', PL: 'branze', NL: 'sectoren' },
'/referenzen': { DE: 'referenzen', EN: 'references', FR: 'references', IT: 'referenze', PL: 'referencje', NL: 'referenties' },
'/team': { DE: 'team', EN: 'team', FR: 'equipe', IT: 'team', PL: 'zespol', NL: 'team' },
'/karriere': { DE: 'karriere', EN: 'careers', FR: 'carrieres', IT: 'carriere', PL: 'kariera', NL: 'werken-bij' },
'/blog': { DE: 'blog', EN: 'blog', FR: 'blog', IT: 'blog', PL: 'blog', NL: 'blog' },
'/kontakt': { DE: 'kontakt', EN: 'contact', FR: 'contact', IT: 'contatto', PL: 'kontakt', NL: 'contact' },
'/projektanfrage': { DE: 'projektanfrage', EN: 'project-inquiry', FR: 'demande-de-projet', IT: 'richiesta-progetto', PL: 'zapytanie-projektowe', NL: 'projectaanvraag' },
'/bewerbung': { DE: 'bewerbung', EN: 'application', FR: 'candidature', IT: 'candidatura', PL: 'aplikacja', NL: 'sollicitatie' },
'/freelancer': { DE: 'lieferantenpool', EN: 'supplier-pool', FR: 'pool-de-fournisseurs', IT: 'pool-fornitori', PL: 'baza-dostawcow', NL: 'leverancierspool' },
};
function slugFor(route, lang) {
const row = ROUTE_SLUGS[route];
if (!row) return '';
return row[lang] || row.DE || '';
}
/* Slug → Route, sprachübergreifend: alte oder fremdsprachige Links bleiben gültig. */
const SLUG_TO_ROUTE = (() => {
const m = {};
ROUTES.forEach(r => {
LANG_CODES.forEach(L => {
const s = (ROUTE_SLUGS[r] || {})[L];
if (s && !m[s]) m[s] = r;
});
const bare = r.slice(1);
if (bare && !m[bare]) m[bare] = r;
});
return m;
})();
function routeForSlug(slug) {
if (!slug) return '/';
return SLUG_TO_ROUTE[slug.toLowerCase()] || null;
}
function App() {
/* URL-Modell: /<sprache>/<seite> mit übersetztem Seiten-Slug, z. B.
/de/leistungen, /en/services, /fr/prestations. Sprache und Seite stehen
sichtbar in der Adresse, jede Seite ist teilbar, Vor/Zurück funktioniert.
URL_ROOT setzt die Seite selbst (deploy/index.html: '/'). Fehlt sie
(lokale Einzeldatei / Vorschau), läuft dasselbe Modell hinter '#'. */
const URL_ROOT = (typeof window.MIAG_URL_ROOT === 'string') ? window.MIAG_URL_ROOT : null;
const CLEAN_URLS = !!URL_ROOT && location.protocol.indexOf('http') === 0;
const readUrl = () => {
let raw = '';
try {
raw = CLEAN_URLS
? location.pathname.slice(URL_ROOT.length)
: (location.hash || '').replace(/^#/, '');
} catch (e) {}
raw = raw.replace(/^\/+/, '').replace(/\/+$/, '');
const parts = raw ? raw.split('/') : [];
let l = null;
if (parts.length && LANG_CODES.indexOf(parts[0].toUpperCase()) >= 0) {
l = parts.shift().toUpperCase();
}
if (!l) {
try {
const q = (new URLSearchParams(location.search).get('lang') || '').toUpperCase();
if (LANG_CODES.indexOf(q) >= 0) l = q;
} catch (e) {}
}
const base = parts.length ? (routeForSlug(parts[0]) || '/') : '/';
const target = parts[1] ? decodeURIComponent(parts[1]) : null;
return { lang: l, base, target };
};
const writeUrl = (base, target, l, replace) => {
try {
let path = (l || 'DE').toLowerCase();
const slug = slugFor(base, l);
if (slug) path += '/' + slug;
if (target) path += '/' + encodeURIComponent(target);
const next = CLEAN_URLS ? (URL_ROOT + path) : (location.pathname + '#/' + path);
if (replace) history.replaceState(null, '', next);
else history.pushState(null, '', next);
} catch (e) {}
};
const initialUrl = readUrl();
const [lang, setLangRaw] = useState(() => {
if (initialUrl.lang) return initialUrl.lang;
try {
const s = (localStorage.getItem('miag.lang') || '').toUpperCase();
if (LANG_CODES.indexOf(s) >= 0) return s;
} catch (e) {}
return 'DE';
});
const [route, setRouteRaw] = useState(initialUrl.base);
const [navTarget, setNavTarget] = useState(initialUrl.target);
const setRoute = (r) => {
const hash = r.indexOf('#');
const base = hash === -1 ? r : r.slice(0, hash);
const target = hash === -1 ? null : r.slice(hash + 1);
setRouteRaw(base);
setNavTarget(target);
writeUrl(base, target, lang);
if (!target) window.scrollTo({ top: 0, behavior: 'instant' });
};
const setLang = (l) => {
setLangRaw(l);
try { localStorage.setItem('miag.lang', l); } catch (e) {}
writeUrl(route, navTarget, l, true);
};
// Adresse beim ersten Laden normalisieren (z. B. '/' → '/de')
useEffect(() => { writeUrl(initialUrl.base, initialUrl.target, lang, true); }, []);
// Vor/Zurück im Browser sowie manuell geänderte Adressen übernehmen
useEffect(() => {
const h = () => {
const p = readUrl();
if (p.lang) {
setLangRaw(p.lang);
try { localStorage.setItem('miag.lang', p.lang); } catch (e) {}
}
setRouteRaw(p.base);
setNavTarget(p.target);
if (!p.target) window.scrollTo({ top: 0, behavior: 'instant' });
};
window.addEventListener('popstate', h);
window.addEventListener('hashchange', h);
return () => {
window.removeEventListener('popstate', h);
window.removeEventListener('hashchange', h);
};
}, []);
// Scroll to an anchored section after navigating (tab targets on
// /leistungen are handled inside the page, not by scrolling).
useEffect(() => {
if (!navTarget || route === '/leistungen') return;
let tries = 0;
const tick = () => {
const el = document.getElementById('sec-' + navTarget);
if (el) {
const top = el.getBoundingClientRect().top + window.scrollY - 84;
window.scrollTo({ top, behavior: 'smooth' });
} else if (tries++ < 20) {
requestAnimationFrame(tick);
}
};
requestAnimationFrame(tick);
}, [navTarget, route]);
// Sprachschicht: deutsche Quelle → englische Ausgabe (vor dem Paint)
MIAG_I18N.setLang(lang);
React.useLayoutEffect(() => {
document.documentElement.lang = (lang || 'DE').toLowerCase();
MIAG_I18N.syncTitle();
MIAG_I18N.translate(document.body);
document.querySelectorAll('a[href^="tel:"],a[href^="mailto:"]').forEach(a => { a.draggable = false; });
});
useEffect(() => { MIAG_I18N.observe(document.body); }, []);
// Navigation aus Inhalten heraus (z. B. FAQ-Link "Karriere")
useEffect(() => {
const h = (e) => setRoute(e.detail);
window.addEventListener('miag:navigate', h);
return () => window.removeEventListener('miag:navigate', h);
}, []);
const [tweaks, setTweak] = useTweaks(TWEAK_DEFAULTS);
// Apply tweaks to CSS custom properties on :root
useEffect(() => {
const root = document.documentElement;
// Accent
root.style.setProperty('--miag-orange-600', tweaks.accent);
// Lighter / darker derived from the base
if (tweaks.accent === '#f09030') {
root.style.setProperty('--miag-orange-400', '#f8b978');
root.style.setProperty('--miag-orange-300', '#fbd1a3');
root.style.setProperty('--miag-orange-700', '#d47a1f');
} else if (tweaks.accent === '#2a7fbf') {
// monochromatic blue-only — use blue tones for accent
root.style.setProperty('--miag-orange-400', '#4f99c9');
root.style.setProperty('--miag-orange-300', '#8cbdde');
root.style.setProperty('--miag-orange-700', '#003f6e');
} else if (tweaks.accent === '#16a34a') {
// green energy variant
root.style.setProperty('--miag-orange-400', '#4ade80');
root.style.setProperty('--miag-orange-300', '#86efac');
root.style.setProperty('--miag-orange-700', '#15803d');
} else if (tweaks.accent === '#d4710f') {
root.style.setProperty('--miag-orange-400', '#e59248');
root.style.setProperty('--miag-orange-300', '#eeb383');
root.style.setProperty('--miag-orange-700', '#a85607');
} else {
// generic shade adjustments
root.style.setProperty('--miag-orange-400', tweaks.accent);
root.style.setProperty('--miag-orange-300', tweaks.accent);
root.style.setProperty('--miag-orange-700', tweaks.accent);
}
// Draft marks visibility
document.body.classList.toggle('miag-no-draft', !tweaks.showDraftMarks);
// Animations
document.body.classList.toggle('miag-no-anim', !tweaks.animations);
// Density
document.body.dataset.density = tweaks.density;
}, [tweaks]);
let page;
if (route === '/') page = <HomePage setRoute={setRoute} />;
else if (route === '/leistungen') page = <LeistungenPage setRoute={setRoute} navTarget={navTarget} />;
else if (route === '/branchen') page = <BranchenPage setRoute={setRoute} />;
else if (route === '/referenzen') page = <ReferenzenPage setRoute={setRoute} lang={lang} />;
else if (route === '/team') page = <TeamPage setRoute={setRoute} />;
else if (route === '/karriere') page = <KarrierePage setRoute={setRoute} />;
else if (route === '/blog') page = <BlogPage setRoute={setRoute} />;
else if (route === '/kontakt') page = <KontaktPage setRoute={setRoute} />;
else if (route === '/projektanfrage') page = <ProjektanfragePage setRoute={setRoute} />;
else if (route === '/bewerbung') page = <BewerbungPage setRoute={setRoute} />;
else if (route === '/freelancer') page = <FreelancerPage setRoute={setRoute} />;
else page = <HomePage setRoute={setRoute} />;
return (
<div key={lang} data-screen-label={ROUTE_LABELS[route] || route}>
<Accessibility />
<Header route={route} setRoute={setRoute} lang={lang} setLang={setLang} />
<div id="main-content" tabIndex={-1} style={{ outline: 'none' }}>{page}</div>
<Footer setRoute={setRoute} />
<TweaksPanel title="MIAG Tweaks">
<TweakSection label="Akzentfarbe" />
<TweakColor
label="Akzent (Dot · Highlight · Claim)"
value={tweaks.accent}
options={['#f09030', '#2a7fbf', '#16a34a', '#d4710f']}
onChange={(v) => setTweak('accent', v)} />
<TweakSection label="Atmosphäre" />
<TweakRadio
label="Hero-Stil"
value={tweaks.heroStyle}
options={['blueprint', 'solid', 'gradient']}
onChange={(v) => setTweak('heroStyle', v)} />
<TweakToggle
label="Sanfte Animationen"
value={tweaks.animations}
onChange={(v) => setTweak('animations', v)} />
<TweakSection label="Layout" />
<TweakRadio
label="Dichte"
value={tweaks.density}
options={['compact', 'regular', 'comfy']}
onChange={(v) => setTweak('density', v)} />
<TweakSection label="Content" />
<TweakToggle
label="Platzhalter sichtbar"
value={tweaks.showDraftMarks}
onChange={(v) => setTweak('showDraftMarks', v)} />
</TweaksPanel>
</div>
);
}
ReactDOM.createRoot(document.getElementById('app')).render(<App/>);
</script>
<style id="miag-tweak-styles">
/* Hide DraftMark when tweak is off */
body.miag-no-draft [title="Platzhalter — Inhalt zur Bestätigung"] { display: none !important; }
/* Disable scroll animations */
body.miag-no-anim * { transition-duration: 0ms !important; animation: none !important; }
body.miag-no-anim [style*="opacity: 0"] { opacity: 1 !important; transform: none !important; }
/* Density modes */
body[data-density="compact"] section { padding-top: 64px !important; padding-bottom: 64px !important; }
body[data-density="comfy"] section { padding-top: 128px !important; padding-bottom: 128px !important; }
/* Hero style overrides */
body[data-hero-style="solid"] svg[width="100%"] pattern { display: none !important; }
/* Telefon- und E-Mail-Links: klickbar UND mit der Maus markierbar (Kopieren) */
a[href^="tel:"], a[href^="mailto:"] { user-select: text; -webkit-user-select: text; -webkit-user-drag: none; }
</style>
</body>
</html>