PageSourceSearch

https://app.platformalp.ru/migrate.html

html platformalp.ru collected 2026-10-03 21:37:54 UTC 3,930 bytes, 99 lines download raw bytes

1<!DOCTYPE html>
2<html lang="ru">
3<head>
4  <meta charset="utf-8">
5  <meta name="viewport" content="width=device-width,initial-scale=1.0">
6  <meta name="robots" content="noindex, nofollow">
7  <title>Платформа LP</title>
8  <style>
9    body { margin: 0; }
10    .ml-wrap {
11      position: fixed; inset: 0; display: flex; align-items: center; justify-content: center;
12      background: #fff;
13    }
14    .ml-spin {
15      width: 40px; height: 40px; margin: 0 auto 16px;
16      border: 3px solid #e5e7eb; border-top-color: #0abba5; border-radius: 50%;
17      animation: mlspin .7s linear infinite;
18    }
19    .ml-text { color: #6b7280; font-family: system-ui, sans-serif; font-size: 14px; }
20    @keyframes mlspin { to { transform: rotate(360deg) } }
21  </style>
22</head>
23<body>
24<div class="ml-wrap"><div style="text-align:center"><div class="ml-spin"></div><div class="ml-text">Загрузка...</div></div></div>
25<script>
26/**
27 * Промежуточная страница перехода new.platformalp.ru → app.platformalp.ru.
28 *
29 * Сюда 302-редиректит nginx на new.platformalp.ru, исходный путь приезжает во
30 * фрагменте: /migrate.html#/pages/123?tab=seo. Фрагмент выбран намеренно —
31 * nginx не умеет url-энкодить $request_uri, а хвост после '#' до сервера не
32 * доходит и доезжает до JS без искажений.
33 *
34 * Зачем отдельная страница, а не гейт внутри index.html: SPA заблокировать
35 * нельзя — Vite кладёт entry-бандл в <head>, и удаление отложенного
36 * module-скрипта из DOM его выполнение не отменяет. Бандл успевает стартовать
37 * без токена, получить 401 и вызвать dropToken(), который стирает только что
38 * перенесённый токен. Здесь бандла нет вообще, поэтому гонки нет.
39 */
40(function () {
41  var OLD_DOMAIN = 'https://new.platformalp.ru';
42  var PREFIX = 'plp_editor';
43  var TOKEN_KEY = PREFIX + '_lpDevTokens';
44  var TIMEOUT_MS = 5000;
45
46  // Куда уходим после переноса. Только собственный относительный путь:
47  // '//host' и абсолютные URL отбрасываем, чтобы страница не стала открытым редиректом.
48  var target = '/';
49  var raw = window.location.hash ? window.location.hash.slice(1) : '';
50  if (raw.charAt(0) === '/' && raw.charAt(1) !== '/' && raw.indexOf('/migrate.html') !== 0) {
51    target = raw;
52  }
53
54  var resolved = false;
55
56  function go() {
57    if (resolved) return;
58    resolved = true;
59    window.location.replace(target);
60  }
61
62  // Токен уже на этом домене — переносить нечего.
63  if (localStorage.getItem(TOKEN_KEY)) {
64    go();
65    return;
66  }
67
68  function onMessage(event) {
69    if (event.origin !== OLD_DOMAIN) return;
70    if (!event.data || event.data.type !== 'plp_migration') return;
71
72    var data = event.data.data;
73    if (event.data.hasAuth && data) {
74      Object.keys(data).forEach(function (key) {
75        try {
76          localStorage.setItem(key, data[key]);
77        } catch (e) {
78          /* квота/приватный режим — переносим что получится */
79        }
80      });
81    }
82
83    go();
84  }
85
86  window.addEventListener('message', onMessage);
87
88  var iframe = document.createElement('iframe');
89  iframe.style.display = 'none';
90  iframe.src = OLD_DOMAIN + '/bridge.html';
91  iframe.onerror = go;
92  document.body.appendChild(iframe);
93
94  // Мост не ответил (заблокирован iframe, сеть, старый кэш) — не держим юзера.
95  setTimeout(go, TIMEOUT_MS);
96})();
97</script>
97
98</body>
99</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.