Найден корректный robots.txt
Файл управления сканированием сайта роботами
?
Robots.txt указывает поисковым роботам, какие страницы сканировать, а какие — нет. Ошибки в файле могут случайно закрыть важные разделы от индексации.
Robots.txt настроен корректно. Размер файла: 20110 байт. Загружен за: 0сек.
Проверяемая страница не запрещена в robots.txt.
Цепочка редиректов для файла robots.txt:
http://console.upsun.com/robots.txt
301 MovedPermanently
https://console.upsun.com/robots.txt
200 OK
Показать содержимое robots.txt
<!DOCTYPE html>
<html lang="en">
<!--
**NOTE:** This is a template that uses ejs syntax. For more info on ejs, see https://ejs.co/.
we use vite-plugin-ejs to inject consoleConfig and the CSPoliciesHTMLTag
-->
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta charset="utf-8" />
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css?family=Open+Sans:400,600,700" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Space+Mono&display=swap" rel="stylesheet">
<!-- the favicon is injected with react-favicon, this prevents the 404 error -->
<link rel="icon" href="data:,">
<meta http-equiv="Content-Security-Policy" content="base-uri 'self'; object-src 'none'; connect-src 'self' *.upsun.com *.pendo.io https://*.platformsh.site https://*.upsun.com https://*.platform.sh https://*.google.fr https://api.github.com https://gitlab.com https://*.plugins.pltfrm.sh https://platform.sh https://*.blackfire.io https://*.plat.farm https://api.stripe.com https://*.google-analytics.com https://*.analytics.google.com https://stats.g.doubleclick.net/ https://*.googleadservices.com https://googleads.g.doubleclick.net https://*.sentry.io https://*.trustarc.com https://*.truste.com https://*.zendesk.com wss://*.zendesk.com https://*.zdassets.com https://ad.doubleclick.net https://*.google.de https://*.google.co.uk https://*.google.ie https://*.google.nl https://*.google.be https://*.google.lu https://*.google.fi https://*.google.no https://*.google.dk https://*.google.pl https://*.google.ca https://*.google.com.au https://*.google.ch https://*.google.at https://*.google.com data:; default-src *.upsun.com *.pendo.io 'self'; font-src *.upsun.com *.pendo.io 'self' https://fonts.gstatic.com https://*.trustarc.com; frame-src *.upsun.com *.pendo.io 'self' https://*.upsun.com https://*.platformsh.site https://*.plugins.pltfrm.sh https://js.stripe.com https://hooks.stripe.com https://js.driftt.com https://www.google.com/ https://www.googletagmanager.com https://player.vimeo.com https://*.trustarc.com https://*.truste.com https://*.zendesk.com https://www.youtube.com https://www.youtube-nocookie.com; img-src *.upsun.com upsun.com *.pendo.io 'self' https://*.platform.sh https://platform.sh/ https://*.blackfire.io https://avatars.githubusercontent.com https://secure.gravatar.com/ https://www.gravatar.com https://www.googletagmanager.com https://*.google-analytics.com https://*.analytics.google.com https://*.googleusercontent.com https://*.trustarc.com https://*.truste.com https://v2assets.zopim.io https://*.zdassets.com https://*.zendesk.com https://px.ads.linkedin.com https://*.google.fr https://*.google.de https://*.google.co.uk https://*.google.ie https://*.google.nl https://*.google.be https://*.google.lu https://*.google.fi https://*.google.no https://*.google.dk https://*.google.pl https://*.google.ca https://*.google.com.au https://*.google.ch https://*.google.at https://*.google.com data:; script-src *.upsun.com *.pendo.io 'self' 'unsafe-inline' 'unsafe-eval' https://js.stripe.com https://www.googletagmanager.com https://www.google-analytics.com https://ssl.google-analytics.com https://js.driftt.com https://t.contentsquare.net https://*.trustarc.com https://*.truste.com https://*.zopim.com https://static.zdassets.com https://*.zendesk.com https://*.googleadservices.com https://www.google.com/recaptcha/ https://www.gstatic.com/recaptcha/ https://www.redditstatic.com https://static.ads-twitter.com https://googleads.g.doubleclick.net https://bat.bing.com wss://*.zopim.com data:; style-src *.upsun.com *.pendo.io 'self' https://*.blackfire.io https://*.platformsh.site https://fonts.googleapis.com 'unsafe-inline' blob: data:; worker-src *.upsun.com *.pendo.io 'self' blob:; ">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
<title>Upsun</title>
<style>
#pre-loading {
position: fixed;
width: 100%;
z-index: 0;
opacity: 0;
animation: fadeOut 14s ease-in-out 0s forwards;
}
#pre-loading .container {
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
position: fixed;
top: 0;
bottom: 0;
left: 0;
right: 0;
}
/* defines the animation */
@keyframes fadeIn {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
@keyframes fadeOut {
0% {
opacity: 1;
}
95% {
opacity: 1;
}
100% {
opacity: 0;
}
}
#fallback {
opacity: 0;
animation: fadeIn 1s ease-in-out 0s forwards;
animation-delay: 12s;
background-color: #eae5e7;
background-position: top center;
background-repeat: no-repeat;
background-size: contain;
color: #1a192b;
top: 0;
left: 0;
right: 0;
bottom: 0;
position: absolute;
font-family: 'Open Sans', Helvetica, Arial, sans-serif;
z-index: 3;
}
#fallback.hidden {
visibility: hidden;
}
#fallback.no-js {
display: block;
}
#fallback .header-wrapper {
margin-top: 30px;
margin-left: 24px;
}
#fallback .header-wrapper svg {
height: 38px;
width: auto;
}
#fallback h1 {
margin-top: 0;
margin-bottom: 24px;
font-weight: 600;
font-size: 20px;
line-height: 22px;
color: #0E0D34;
}
#fallback p {
font-size: 14px;
line-height: 24px;
margin-bottom: 32px;
color: #4A495E;
}
#fallback .text-wrapper {
width: 80vw;
margin-top: 62px;
margin-left: 24px;
max-height: 60vh;
position: relative;
z-index: 2;
}
#fallback ul li {
font-size: 15px;
}
#fallback.no-js .with-js,
#fallback .no-js-message {
display: none;
}
#fallback.no-js .no-js-message {
display: block;
}
@media (min-width: 900px) {
#fallback .text-wrapper {
margin-top: 20vh;
}
#fallback h1 {
font-size: 32px;
color: #1A192B;
}
#fallback p {
color: #1A192B;
margin-bottom: 64px;
font-size: 16px;
line-height: 22px;
}
#fallback .header-wrapper {
margin-left: 10vw;
}
#fallback .text-wrapper {
width: 45vw;
margin-left: 10vw;
max-height: 80vh;
}
}
.actions-row {
margin-top: 48px;
}
.actions-row .button {
margin-right: 8px;
}
.button {
height: 32px;
line-height: 32px;
cursor: pointer;
font-size: 14px;
font-weight: 600;
display: inline-block;
-webkit-font-smoothing: auto;
border-width: 1px;
border-style: solid;
border-color: transparent;
border-image: initial;
border-radius: 2px;
padding: 0px 24px;
text-decoration: none;
}
.button--primary {
background-color: #4786FF;
border-color: #4786FF;
color: #ffffff;
}
.button--secondary {
color: #1A192B;
background: transparent;
border-color: #C9D0E4;
}
.drift-widget-avatar {
background: 'vendor_resources/images/logo-ui.svg'
}
</style>
<script>
var _LOADED = {};
var _INIT = false;
var _ZENDESK_ALLOWED = false;
// Configuration constants
var TRUSTARC_CONFIG = {
POLLING_INTERVAL: 100, // ms - reduced from 50ms for better performance
MAX_POLLING_ATTEMPTS: 100, // 10 seconds total
RELOAD_DELAY: 250 // ms - increased for better reliability
};
// --- VENDOR LOADER FUNCTIONS ---------------------------------------------
function loadDrift() {
if (_LOADED.drift) return;
const div = document.getElementById('marketing-config');
const id = div ? div.getAttribute('data-drift-id') : null;
if (!id) return;
!function() {
var t = window.driftt = window.drift = window.driftt || [];
if (!t.init) {
if (t.invoked) return;
t.invoked = !0, t.methods = ["identify", "config", "track", "reset", "debug", "show", "ping", "page", "hide", "off", "on"],
t.factory = function (e) {
return function () {
var n = Array.prototype.slice.call(arguments);
return n.unshift(e), t.push(n), t;
};
}, t.methods.forEach(function (e) {
t[e] = t.factory(e);
}), t.load = function (t) {
var e = 3e5, n = Math.ceil(new Date() / e) * e, o = document.createElement("script");
o.type = "text/javascript", o.async = !0, o.crossorigin = "anonymous", o.src = "https://js.driftt.com/include/" + n + "/" + t + ".js";
var i = document.getElementsByTagName("script")[0];
i.parentNode.insertBefore(o, i);
};
}
}();
drift.SNIPPET_VERSION = '0.3.1';
drift.load(id);
_LOADED.drift = true;
}
function loadZendesk() {
if (_LOADED.zendesk) return;
const div = document.getElementById('marketing-config');
const url = div ? div.getAttribute('data-zendesk-messenger-url') : null;
if (!url) return;
var script = document.createElement('script');
script.id = 'ze-snippet';
script.async = true;
script.src = url;
// The messenger launcher auto-displays once the snippet finishes loading.
// Re-evaluate visibility against the current path, since the user may have
// navigated away from /tickets while the script was still loading.
script.onload = function() { updateZendesk(); };
document.body.appendChild(script);
_LOADED.zendesk = true;
}
function isTicketsPage() {
return /\/tickets(\/|$)/.test(window.location.pathname);
}
// Show the Zendesk widget only on the /tickets page; hide it elsewhere.
function updateZendesk() {
if (!_ZENDESK_ALLOWED) return;
if (isTicketsPage()) {
if (!_LOADED.zendesk) {
loadZendesk();
} else if (window.zE) {
window.zE('messenger', 'show');
}
} else if (_LOADED.zendesk && window.zE) {
window.zE('messenger', 'hide');
}
}
function loadPendo() {
if (_LOADED.pendo) return;
const div = document.getElementById('marketing-config');
if (!div) return;
let id = div.getAttribute('data-pendo-id');
if (window.location.origin === "https://auth.upsun.com") {
id = div.getAttribute('data-pendo-auth-id');
}
if (!id) return;
(function(apiKey){
(function(p,e,n,d,o){var v,w,x,y,z;o=p[d]=p[d]||{};o._q=o._q||[];
v=['initialize','identify','updateOptions','pageLoad','track'];for(w=0,x=v.length;w<x;++w)(function(m){
o[m]=o[m]||function(){o._q[m===v[0]?'unshift':'push']([m].concat([].slice.call(arguments,0)));};})(v[w]);
y=e.createElement(n);y.async=!0;y.src='https://content.engage.upsun.com/agent/static/'+apiKey+'/pendo.js';
z=e.getElementsByTagName(n)[0];z.parentNode.insertBefore(y,z);})(window,document,'script','pendo');
})(id);
_LOADED.pendo = true;
}
function loadGoogleAds() {
if (_LOADED.googleAds) return;
const div = document.getElementById('marketing-config');
const id = div ? div.getAttribute('data-google-ads-id') : null;
if (!id) return;
var script = document.createElement('script');
script.async = true;
script.src = 'https://www.googletagmanager.com/gtag/js?id=' + id;
document.body.appendChild(script);
// The script is served from googletagmanager.com but loads Google Ads
// directly (gtag), not a GTM container. Conversions are sent via gtag
// from the analytics middleware (see googleAdsTracker.ts).
window.dataLayer = window.dataLayer || [];
window.gtag = function() { window.dataLayer.push(arguments); };
window.gtag('js', new Date());
window.gtag('config', id);
_LOADED.googleAds = true;
}
// --- CONSENT ROUTER ------------------------------------------------------
/**
* Receives approved categories and triggers the appropriate loaders.
* @param {string} category - The Category ID or Name from TrustArc.
*/
function onConsentGranted(category) {
switch (String(category).toLowerCase()) {
case '2':
case 'functional':
loadDrift();
_ZENDESK_ALLOWED = true;
updateZendesk();
break;
case '3':
case 'advertising':
loadGoogleAds();
break;
case '4':
case 'analytics':
loadPendo();
break;
}
}
// --- TRUSTARC INTEGRATION ------------------------------------------------
function initTrustArc() {
if (_INIT || !window.PrivacyManagerAPI || !window.truste || !window.truste.eu) return;
_INIT = true;
// 1. Hook into TrustArc Close Event to handle consent revocation (Auto-Reload)
var oldPrefClose = window.truste.eu.prefclose;
var startCookie = window.truste.eu.bindMap.prefCookie;
window.truste.eu.prefclose = function() {
oldPrefClose();
var endCookie = window.truste.eu.bindMap.prefCookie;
// If consent preferences changed, reload to ensure revoked scripts are unloaded
if (startCookie !== endCookie) {
setTimeout(function() { window.location.reload(); }, TRUSTARC_CONFIG.RELOAD_DELAY);
}
};
// 2. Listen for "Approved" messages from the API
window.addEventListener("message", function(e) {
try {
var json = JSON.parse(e.data);
var api = json.PrivacyManagerAPI;
if (api && api.action === "getConsent" && api.consent === "approved") {
onConsentGranted(api.type);
}
} catch (e) {
// Silently ignore malformed messages
}
}, false);
// 3. Query current status for all categories
// We loop through all potential categories to check current status
var baseReq = { PrivacyManagerAPI: { self: window.location.hostname, action: "getConsent", timestamp: new Date().getTime() }};
['functional', 'advertising', '4'].forEach(function(type) {
var req = JSON.parse(JSON.stringify(baseReq));
req.PrivacyManagerAPI.type = type;
window.top.postMessage(JSON.stringify(req), "*");
});
}
// --- MAIN INITIALIZATION -------------------------------------------------
document.addEventListener('DOMContentLoaded', function() {
// Localhost check
function isLocalhost() {
return window.location.hostname === 'localhost' ||
window.location.hostname === '127.0.0.1' ||
window.location.hostname.startsWith('192.168.') ||
window.location.hostname.indexOf('.local') !== -1;
}
if (isLocalhost()) return;
// Re-evaluate Zendesk widget visibility on SPA navigation
['pushState', 'replaceState'].forEach(function(method) {
var original = history[method];
history[method] = function() {
var result = original.apply(this, arguments);
updateZendesk();
return result;
};
});
window.addEventListener('popstate', updateZendesk);
const configDiv = document.getElementById('marketing-config');
if (!configDiv) return;
// 1. Load TrustArc (Category 1 - Required)
const cookielawId = configDiv.getAttribute('data-cookielaw-id');
if (cookielawId) {
var script = document.createElement('script');
script.type = "text/javascript";
script.src = "https://consent.trustarc.com/v2/notice/" + cookielawId + "?pcookie";
script.setAttribute("async", "async");
script.setAttribute("crossorigin", "");
document.body.appendChild(script);
// Poll for API existence with timeout
var attempts = 0;
var interval = setInterval(function() {
attempts++;
if (window.PrivacyManagerAPI) {
initTrustArc();
clearInterval(interval);
} else if (attempts >= TRUSTARC_CONFIG.MAX_POLLING_ATTEMPTS) {
clearInterval(interval);
console.warn('TrustArc API not available after polling timeout');
}
}, TRUSTARC_CONFIG.POLLING_INTERVAL);
} else {
// When TrustArc is not configured, load analytics directly
// This allows Pendo to work in staging/design environments
loadPendo();
loadDrift();
_ZENDESK_ALLOWED = true;
updateZendesk();
}
// Also load GA experiment function only if not on localhost
loadGaExperiment();
});
function loadGaExperiment() {
// Define the original GA experiment function
window.addGaUserToExperiment = function(experimentName, experimentVariant) {
if (
typeof experimentName !== "string" ||
experimentName.length <= 0 || experimentName.length > 36
) {
throw new Error(
"experimentName must be a non-empty string between 1 and 36 characters"
);
}
if (
typeof experimentVariant !== "string" ||
experimentVariant.length <= 0 || experimentVariant.length > 36
) {
throw new Error(
"experimentVariant must be a non-empty string between 1 and 36 characters"
);
}
if (typeof dataLayer === "undefined") {
console.warn("dataLayer is not ready to be called");
}
dataLayer.push({
"Experiment Name": experimentName,
"Experiment Variant": experimentVariant,
event: "Experiment Joined" // Do not change - fire last.
});
};
}
</script>
<script type="module" crossorigin src="/assets/index-DVS7Lm1Q.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-BlPEEhjx.css">
</head>
<body>
<!-- Hidden div to store configuration values using EJS -->
<div id="marketing-config" style="display:none;"
data-drift-id="7prg3wvt49yk"
data-google-ads-id="AW-958572901"
data-pendo-id="a7d1f2f1-632e-440e-51d1-584419684539"
data-pendo-auth-id="608512d4-8044-435d-4d86-dbbf151511b8"
data-cookielaw-id="8jqkqc"
data-zendesk-messenger-url="https://static.zdassets.com/ekr/snippet.js?key=e0bcb0cf-9496-44be-9c98-8728145585f3"
></div>
<div id="app"></div>
<div id="portal-root"></div>
<div id="fallback" class="hidden no-js ">
<div class="text-wrapper">
<h1>Something's not right</h1>
<div class="with-js">
<p>Try checking your internet connection, disable any ad blockers and if all else fails - get in touch
so we can take a closer look.</p>
<div class="page-error-cta actions-row">
<a href="/" class="button button--primary">Back to projects</a>
<a target="_blank" rel="noreferrer" href="https://community.upsun.com/" class="button button--secondary main-error-cta">Contact us</a>
</div>
</div> <!-- with-js -->
<div class="no-js-message">
<p>Javascript is required to run this application.</p>
<ul>
<li>
<a href="https://www.enable-javascript.com/">How to enable Javascript</a>
</li>
</ul>
</div>
</div> <!-- text-wrapper -->
</div> <!-- fallback -->
<div id="pre-loading"></div>
<script>
const noJs = document.querySelector(".no-js");
if (noJs) {
noJs.classList.remove("no-js");
}
setTimeout(() => {
const fallBack = document.querySelector("#fallback");
if (fallBack) {
fallBack.classList.remove("hidden");
}
}, 2000);
</script>
</body>
</html>