t23:about.9300
t23:about.9301
t23:about.9302
t23:about.65106
t23:about.65107
t23:about.65109
t23:about.65111
t23:about.9303
t23:about.9304
t23:about.9306
t23:about.9307
t23:about.9309
t23:about.9310
t23:about.9312
t23:about.9313
t23:about.9314
/logo/social.webp` без themes/{theme}/ prefix. // Также social card crawlers (FB/Twitter/Telegram) и Google search index содержат старые // pre-cutover URLs. 301 → текущий theme's asset. $legacyLogoRedirect = function ($file) { $template = strtolower(config('core.template') ?? 't21'); return redirect("/themes/{$template}/logo/{$file}", 301); }; Route::get('logo/{file}', $legacyLogoRedirect) ->where('file', '(social|og_image|twitter|favicon|logo|insthacker)\.(png|webp|jpg|jpeg|svg)'); // iOS Safari + iOS apps + Pinterest crawler автоматически запрашивают эти URLs независимо // от в HTML. 301 → theme's favicon.png (180×180+ ideally). $appleTouchRedirect = function () { $template = strtolower(config('core.template') ?? 't21'); return redirect("/themes/{$template}/logo/favicon.png", 301); }; Route::get('apple-touch-icon{any}.png', $appleTouchRedirect) ->where('any', '(-precomposed|-[0-9]+x[0-9]+|-[0-9]+x[0-9]+-precomposed)?'); // Password managers (1Password, Bitwarden, iCloud Keychain) probe этот URL для passkey // discovery (W3C draft). Без endpoint'а они fall back на password autofill — функционально // не сломано, но 404 в логах. Возвращаем валидный пустой manifest. Route::get('.well-known/passkey-endpoints', function () { return response()->json( ['enroll' => null, 'manage' => null], 200, ['Cache-Control' => 'public, max-age=86400'] ); }); /logo/social.webp` без themes/{theme}/ prefix. // Также social card crawlers (FB/Twitter/Telegram) и Google search index содержат старые // pre-cutover URLs. 301 → текущий theme's asset. $legacyLogoRedirect = function ($file) { $template = strtolower(config('core.template') ?? 't21'); return redirect("/themes/{$template}/logo/{$file}", 301); }; Route::get('logo/{file}', $legacyLogoRedirect) ->where('file', '(social|og_image|twitter|favicon|logo|insthacker)\.(png|webp|jpg|jpeg|svg)'); // iOS Safari + iOS apps + Pinterest crawler автоматически запрашивают эти URLs независимо // от в HTML. 301 → theme's favicon.png (180×180+ ideally). $appleTouchRedirect = function () { $template = strtolower(config('core.template') ?? 't21'); return redirect("/themes/{$template}/logo/favicon.png", 301); }; Route::get('apple-touch-icon{any}.png', $appleTouchRedirect) ->where('any', '(-precomposed|-[0-9]+x[0-9]+|-[0-9]+x[0-9]+-precomposed)?'); // Password managers (1Password, Bitwarden, iCloud Keychain) probe этот URL для passkey // discovery (W3C draft). Без endpoint'а они fall back на password autofill — функционально // не сломано, но 404 в логах. Возвращаем валидный пустой manifest. Route::get('.well-known/passkey-endpoints', function () { return response()->json( ['enroll' => null, 'manage' => null], 200, ['Cache-Control' => 'public, max-age=86400'] ); }); /logo/social.webp` без themes/{theme}/ prefix. // Также social card crawlers (FB/Twitter/Telegram) и Google search index содержат старые // pre-cutover URLs. 301 → текущий theme's asset. $legacyLogoRedirect = function ($file) { $template = strtolower(config('core.template') ?? 't21'); return redirect("/themes/{$template}/logo/{$file}", 301); }; Route::get('logo/{file}', $legacyLogoRedirect) ->where('file', '(social|og_image|twitter|favicon|logo|insthacker)\.(png|webp|jpg|jpeg|svg)'); // iOS Safari + iOS apps + Pinterest crawler автоматически запрашивают эти URLs независимо // от в HTML. 301 → theme's favicon.png (180×180+ ideally). $appleTouchRedirect = function () { $template = strtolower(config('core.template') ?? 't21'); return redirect("/themes/{$template}/logo/favicon.png", 301); }; Route::get('apple-touch-icon{any}.png', $appleTouchRedirect) ->where('any', '(-precomposed|-[0-9]+x[0-9]+|-[0-9]+x[0-9]+-precomposed)?'); // Password managers (1Password, Bitwarden, iCloud Keychain) probe этот URL для passkey // discovery (W3C draft). Без endpoint'а они fall back на password autofill — функционально // не сломано, но 404 в логах. Возвращаем валидный пустой manifest. Route::get('.well-known/passkey-endpoints', function () { return response()->json( ['enroll' => null, 'manage' => null], 200, ['Cache-Control' => 'public, max-age=86400'] ); }); /logo/social.webp` без themes/{theme}/ prefix. // Также social card crawlers (FB/Twitter/Telegram) и Google search index содержат старые // pre-cutover URLs. 301 → текущий theme's asset. $legacyLogoRedirect = function ($file) { $template = strtolower(config('core.template') ?? 't21'); return redirect("/themes/{$template}/logo/{$file}", 301); }; Route::get('logo/{file}', $legacyLogoRedirect) ->where('file', '(social|og_image|twitter|favicon|logo|insthacker)\.(png|webp|jpg|jpeg|svg)'); // iOS Safari + iOS apps + Pinterest crawler автоматически запрашивают эти URLs независимо // от в HTML. 301 → theme's favicon.png (180×180+ ideally). $appleTouchRedirect = function () { $template = strtolower(config('core.template') ?? 't21'); return redirect("/themes/{$template}/logo/favicon.png", 301); }; Route::get('apple-touch-icon{any}.png', $appleTouchRedirect) ->where('any', '(-precomposed|-[0-9]+x[0-9]+|-[0-9]+x[0-9]+-precomposed)?'); // Password managers (1Password, Bitwarden, iCloud Keychain) probe этот URL для passkey // discovery (W3C draft). Без endpoint'а они fall back на password autofill — функционально // не сломано, но 404 в логах. Возвращаем валидный пустой manifest. Route::get('.well-known/passkey-endpoints', function () { return response()->json( ['enroll' => null, 'manage' => null], 200, ['Cache-Control' => 'public, max-age=86400'] ); }); /logo/social.webp` без themes/{theme}/ prefix. // Также social card crawlers (FB/Twitter/Telegram) и Google search index содержат старые // pre-cutover URLs. 301 → текущий theme's asset. $legacyLogoRedirect = function ($file) { $template = strtolower(config('core.template') ?? 't21'); return redirect("/themes/{$template}/logo/{$file}", 301); }; Route::get('logo/{file}', $legacyLogoRedirect) ->where('file', '(social|og_image|twitter|favicon|logo|insthacker)\.(png|webp|jpg|jpeg|svg)'); // iOS Safari + iOS apps + Pinterest crawler автоматически запрашивают эти URLs независимо // от в HTML. 301 → theme's favicon.png (180×180+ ideally). $appleTouchRedirect = function () { $template = strtolower(config('core.template') ?? 't21'); return redirect("/themes/{$template}/logo/favicon.png", 301); }; Route::get('apple-touch-icon{any}.png', $appleTouchRedirect) ->where('any', '(-precomposed|-[0-9]+x[0-9]+|-[0-9]+x[0-9]+-precomposed)?'); // Password managers (1Password, Bitwarden, iCloud Keychain) probe этот URL для passkey // discovery (W3C draft). Без endpoint'а они fall back на password autofill — функционально // не сломано, но 404 в логах. Возвращаем валидный пустой manifest. Route::get('.well-known/passkey-endpoints', function () { return response()->json( ['enroll' => null, 'manage' => null], 200, ['Cache-Control' => 'public, max-age=86400'] ); }); /logo/social.webp` без themes/{theme}/ prefix. // Также social card crawlers (FB/Twitter/Telegram) и Google search index содержат старые // pre-cutover URLs. 301 → текущий theme's asset. $legacyLogoRedirect = function ($file) { $template = strtolower(config('core.template') ?? 't21'); return redirect("/themes/{$template}/logo/{$file}", 301); }; Route::get('logo/{file}', $legacyLogoRedirect) ->where('file', '(social|og_image|twitter|favicon|logo|insthacker)\.(png|webp|jpg|jpeg|svg)'); // iOS Safari + iOS apps + Pinterest crawler автоматически запрашивают эти URLs независимо // от в HTML. 301 → theme's favicon.png (180×180+ ideally). $appleTouchRedirect = function () { $template = strtolower(config('core.template') ?? 't21'); return redirect("/themes/{$template}/logo/favicon.png", 301); }; Route::get('apple-touch-icon{any}.png', $appleTouchRedirect) ->where('any', '(-precomposed|-[0-9]+x[0-9]+|-[0-9]+x[0-9]+-precomposed)?'); // Password managers (1Password, Bitwarden, iCloud Keychain) probe этот URL для passkey // discovery (W3C draft). Без endpoint'а они fall back на password autofill — функционально // не сломано, но 404 в логах. Возвращаем валидный пустой manifest. Route::get('.well-known/passkey-endpoints', function () { return response()->json( ['enroll' => null, 'manage' => null], 200, ['Cache-Control' => 'public, max-age=86400'] ); }); /logo/social.webp` без themes/{theme}/ prefix. // Также social card crawlers (FB/Twitter/Telegram) и Google search index содержат старые // pre-cutover URLs. 301 → текущий theme's asset. $legacyLogoRedirect = function ($file) { $template = strtolower(config('core.template') ?? 't21'); return redirect("/themes/{$template}/logo/{$file}", 301); }; Route::get('logo/{file}', $legacyLogoRedirect) ->where('file', '(social|og_image|twitter|favicon|logo|insthacker)\.(png|webp|jpg|jpeg|svg)'); // iOS Safari + iOS apps + Pinterest crawler автоматически запрашивают эти URLs независимо // от в HTML. 301 → theme's favicon.png (180×180+ ideally). $appleTouchRedirect = function () { $template = strtolower(config('core.template') ?? 't21'); return redirect("/themes/{$template}/logo/favicon.png", 301); }; Route::get('apple-touch-icon{any}.png', $appleTouchRedirect) ->where('any', '(-precomposed|-[0-9]+x[0-9]+|-[0-9]+x[0-9]+-precomposed)?'); // Password managers (1Password, Bitwarden, iCloud Keychain) probe этот URL для passkey // discovery (W3C draft). Без endpoint'а они fall back на password autofill — функционально // не сломано, но 404 в логах. Возвращаем валидный пустой manifest. Route::get('.well-known/passkey-endpoints', function () { return response()->json( ['enroll' => null, 'manage' => null], 200, ['Cache-Control' => 'public, max-age=86400'] ); }); /logo/social.webp` без themes/{theme}/ prefix. // Также social card crawlers (FB/Twitter/Telegram) и Google search index содержат старые // pre-cutover URLs. 301 → текущий theme's asset. $legacyLogoRedirect = function ($file) { $template = strtolower(config('core.template') ?? 't21'); return redirect("/themes/{$template}/logo/{$file}", 301); }; Route::get('logo/{file}', $legacyLogoRedirect) ->where('file', '(social|og_image|twitter|favicon|logo|insthacker)\.(png|webp|jpg|jpeg|svg)'); // iOS Safari + iOS apps + Pinterest crawler автоматически запрашивают эти URLs независимо // от в HTML. 301 → theme's favicon.png (180×180+ ideally). $appleTouchRedirect = function () { $template = strtolower(config('core.template') ?? 't21'); return redirect("/themes/{$template}/logo/favicon.png", 301); }; Route::get('apple-touch-icon{any}.png', $appleTouchRedirect) ->where('any', '(-precomposed|-[0-9]+x[0-9]+|-[0-9]+x[0-9]+-precomposed)?'); // Password managers (1Password, Bitwarden, iCloud Keychain) probe этот URL для passkey // discovery (W3C draft). Без endpoint'а они fall back на password autofill — функционально // не сломано, но 404 в логах. Возвращаем валидный пустой manifest. Route::get('.well-known/passkey-endpoints', function () { return response()->json( ['enroll' => null, 'manage' => null], 200, ['Cache-Control' => 'public, max-age=86400'] ); }); /logo/social.webp` без themes/{theme}/ prefix. // Также social card crawlers (FB/Twitter/Telegram) и Google search index содержат старые // pre-cutover URLs. 301 → текущий theme's asset. $legacyLogoRedirect = function ($file) { $template = strtolower(config('core.template') ?? 't21'); return redirect("/themes/{$template}/logo/{$file}", 301); }; Route::get('logo/{file}', $legacyLogoRedirect) ->where('file', '(social|og_image|twitter|favicon|logo|insthacker)\.(png|webp|jpg|jpeg|svg)'); // iOS Safari + iOS apps + Pinterest crawler автоматически запрашивают эти URLs независимо // от в HTML. 301 → theme's favicon.png (180×180+ ideally). $appleTouchRedirect = function () { $template = strtolower(config('core.template') ?? 't21'); return redirect("/themes/{$template}/logo/favicon.png", 301); }; Route::get('apple-touch-icon{any}.png', $appleTouchRedirect) ->where('any', '(-precomposed|-[0-9]+x[0-9]+|-[0-9]+x[0-9]+-precomposed)?'); // Password managers (1Password, Bitwarden, iCloud Keychain) probe этот URL для passkey // discovery (W3C draft). Без endpoint'а они fall back на password autofill — функционально // не сломано, но 404 в логах. Возвращаем валидный пустой manifest. Route::get('.well-known/passkey-endpoints', function () { return response()->json( ['enroll' => null, 'manage' => null], 200, ['Cache-Control' => 'public, max-age=86400'] ); }); /logo/social.webp` без themes/{theme}/ prefix. // Также social card crawlers (FB/Twitter/Telegram) и Google search index содержат старые // pre-cutover URLs. 301 → текущий theme's asset. $legacyLogoRedirect = function ($file) { $template = strtolower(config('core.template') ?? 't21'); return redirect("/themes/{$template}/logo/{$file}", 301); }; Route::get('logo/{file}', $legacyLogoRedirect) ->where('file', '(social|og_image|twitter|favicon|logo|insthacker)\.(png|webp|jpg|jpeg|svg)'); // iOS Safari + iOS apps + Pinterest crawler автоматически запрашивают эти URLs независимо // от в HTML. 301 → theme's favicon.png (180×180+ ideally). $appleTouchRedirect = function () { $template = strtolower(config('core.template') ?? 't21'); return redirect("/themes/{$template}/logo/favicon.png", 301); }; Route::get('apple-touch-icon{any}.png', $appleTouchRedirect) ->where('any', '(-precomposed|-[0-9]+x[0-9]+|-[0-9]+x[0-9]+-precomposed)?'); // Password managers (1Password, Bitwarden, iCloud Keychain) probe этот URL для passkey // discovery (W3C draft). Без endpoint'а они fall back на password autofill — функционально // не сломано, но 404 в логах. Возвращаем валидный пустой manifest. Route::get('.well-known/passkey-endpoints', function () { return response()->json( ['enroll' => null, 'manage' => null], 200, ['Cache-Control' => 'public, max-age=86400'] ); }); /logo/social.webp` без themes/{theme}/ prefix. // Также social card crawlers (FB/Twitter/Telegram) и Google search index содержат старые // pre-cutover URLs. 301 → текущий theme's asset. $legacyLogoRedirect = function ($file) { $template = strtolower(config('core.template') ?? 't21'); return redirect("/themes/{$template}/logo/{$file}", 301); }; Route::get('logo/{file}', $legacyLogoRedirect) ->where('file', '(social|og_image|twitter|favicon|logo|insthacker)\.(png|webp|jpg|jpeg|svg)'); // iOS Safari + iOS apps + Pinterest crawler автоматически запрашивают эти URLs независимо // от в HTML. 301 → theme's favicon.png (180×180+ ideally). $appleTouchRedirect = function () { $template = strtolower(config('core.template') ?? 't21'); return redirect("/themes/{$template}/logo/favicon.png", 301); }; Route::get('apple-touch-icon{any}.png', $appleTouchRedirect) ->where('any', '(-precomposed|-[0-9]+x[0-9]+|-[0-9]+x[0-9]+-precomposed)?'); // Password managers (1Password, Bitwarden, iCloud Keychain) probe этот URL для passkey // discovery (W3C draft). Без endpoint'а они fall back на password autofill — функционально // не сломано, но 404 в логах. Возвращаем валидный пустой manifest. Route::get('.well-known/passkey-endpoints', function () { return response()->json( ['enroll' => null, 'manage' => null], 200, ['Cache-Control' => 'public, max-age=86400'] ); }); /logo/social.webp` без themes/{theme}/ prefix. // Также social card crawlers (FB/Twitter/Telegram) и Google search index содержат старые // pre-cutover URLs. 301 → текущий theme's asset. $legacyLogoRedirect = function ($file) { $template = strtolower(config('core.template') ?? 't21'); return redirect("/themes/{$template}/logo/{$file}", 301); }; Route::get('logo/{file}', $legacyLogoRedirect) ->where('file', '(social|og_image|twitter|favicon|logo|insthacker)\.(png|webp|jpg|jpeg|svg)'); // iOS Safari + iOS apps + Pinterest crawler автоматически запрашивают эти URLs независимо // от в HTML. 301 → theme's favicon.png (180×180+ ideally). $appleTouchRedirect = function () { $template = strtolower(config('core.template') ?? 't21'); return redirect("/themes/{$template}/logo/favicon.png", 301); }; Route::get('apple-touch-icon{any}.png', $appleTouchRedirect) ->where('any', '(-precomposed|-[0-9]+x[0-9]+|-[0-9]+x[0-9]+-precomposed)?'); // Password managers (1Password, Bitwarden, iCloud Keychain) probe этот URL для passkey // discovery (W3C draft). Без endpoint'а они fall back на password autofill — функционально // не сломано, но 404 в логах. Возвращаем валидный пустой manifest. Route::get('.well-known/passkey-endpoints', function () { return response()->json( ['enroll' => null, 'manage' => null], 200, ['Cache-Control' => 'public, max-age=86400'] ); }); /logo/social.webp` без themes/{theme}/ prefix. // Также social card crawlers (FB/Twitter/Telegram) и Google search index содержат старые // pre-cutover URLs. 301 → текущий theme's asset. $legacyLogoRedirect = function ($file) { $template = strtolower(config('core.template') ?? 't21'); return redirect("/themes/{$template}/logo/{$file}", 301); }; Route::get('logo/{file}', $legacyLogoRedirect) ->where('file', '(social|og_image|twitter|favicon|logo|insthacker)\.(png|webp|jpg|jpeg|svg)'); // iOS Safari + iOS apps + Pinterest crawler автоматически запрашивают эти URLs независимо // от в HTML. 301 → theme's favicon.png (180×180+ ideally). $appleTouchRedirect = function () { $template = strtolower(config('core.template') ?? 't21'); return redirect("/themes/{$template}/logo/favicon.png", 301); }; Route::get('apple-touch-icon{any}.png', $appleTouchRedirect) ->where('any', '(-precomposed|-[0-9]+x[0-9]+|-[0-9]+x[0-9]+-precomposed)?'); // Password managers (1Password, Bitwarden, iCloud Keychain) probe этот URL для passkey // discovery (W3C draft). Без endpoint'а они fall back на password autofill — функционально // не сломано, но 404 в логах. Возвращаем валидный пустой manifest. Route::get('.well-known/passkey-endpoints', function () { return response()->json( ['enroll' => null, 'manage' => null], 200, ['Cache-Control' => 'public, max-age=86400'] ); }); /logo/social.webp` без themes/{theme}/ prefix. // Также social card crawlers (FB/Twitter/Telegram) и Google search index содержат старые // pre-cutover URLs. 301 → текущий theme's asset. $legacyLogoRedirect = function ($file) { $template = strtolower(config('core.template') ?? 't21'); return redirect("/themes/{$template}/logo/{$file}", 301); }; Route::get('logo/{file}', $legacyLogoRedirect) ->where('file', '(social|og_image|twitter|favicon|logo|insthacker)\.(png|webp|jpg|jpeg|svg)'); // iOS Safari + iOS apps + Pinterest crawler автоматически запрашивают эти URLs независимо // от в HTML. 301 → theme's favicon.png (180×180+ ideally). $appleTouchRedirect = function () { $template = strtolower(config('core.template') ?? 't21'); return redirect("/themes/{$template}/logo/favicon.png", 301); }; Route::get('apple-touch-icon{any}.png', $appleTouchRedirect) ->where('any', '(-precomposed|-[0-9]+x[0-9]+|-[0-9]+x[0-9]+-precomposed)?'); // Password managers (1Password, Bitwarden, iCloud Keychain) probe этот URL для passkey // discovery (W3C draft). Без endpoint'а они fall back на password autofill — функционально // не сломано, но 404 в логах. Возвращаем валидный пустой manifest. Route::get('.well-known/passkey-endpoints', function () { return response()->json( ['enroll' => null, 'manage' => null], 200, ['Cache-Control' => 'public, max-age=86400'] ); }); /logo/social.webp` без themes/{theme}/ prefix. // Также social card crawlers (FB/Twitter/Telegram) и Google search index содержат старые // pre-cutover URLs. 301 → текущий theme's asset. $legacyLogoRedirect = function ($file) { $template = strtolower(config('core.template') ?? 't21'); return redirect("/themes/{$template}/logo/{$file}", 301); }; Route::get('logo/{file}', $legacyLogoRedirect) ->where('file', '(social|og_image|twitter|favicon|logo|insthacker)\.(png|webp|jpg|jpeg|svg)'); // iOS Safari + iOS apps + Pinterest crawler автоматически запрашивают эти URLs независимо // от в HTML. 301 → theme's favicon.png (180×180+ ideally). $appleTouchRedirect = function () { $template = strtolower(config('core.template') ?? 't21'); return redirect("/themes/{$template}/logo/favicon.png", 301); }; Route::get('apple-touch-icon{any}.png', $appleTouchRedirect) ->where('any', '(-precomposed|-[0-9]+x[0-9]+|-[0-9]+x[0-9]+-precomposed)?'); // Password managers (1Password, Bitwarden, iCloud Keychain) probe этот URL для passkey // discovery (W3C draft). Без endpoint'а они fall back на password autofill — функционально // не сломано, но 404 в логах. Возвращаем валидный пустой manifest. Route::get('.well-known/passkey-endpoints', function () { return response()->json( ['enroll' => null, 'manage' => null], 200, ['Cache-Control' => 'public, max-age=86400'] ); }); /logo/social.webp` без themes/{theme}/ prefix. // Также social card crawlers (FB/Twitter/Telegram) и Google search index содержат старые // pre-cutover URLs. 301 → текущий theme's asset. $legacyLogoRedirect = function ($file) { $template = strtolower(config('core.template') ?? 't21'); return redirect("/themes/{$template}/logo/{$file}", 301); }; Route::get('logo/{file}', $legacyLogoRedirect) ->where('file', '(social|og_image|twitter|favicon|logo|insthacker)\.(png|webp|jpg|jpeg|svg)'); // iOS Safari + iOS apps + Pinterest crawler автоматически запрашивают эти URLs независимо // от в HTML. 301 → theme's favicon.png (180×180+ ideally). $appleTouchRedirect = function () { $template = strtolower(config('core.template') ?? 't21'); return redirect("/themes/{$template}/logo/favicon.png", 301); }; Route::get('apple-touch-icon{any}.png', $appleTouchRedirect) ->where('any', '(-precomposed|-[0-9]+x[0-9]+|-[0-9]+x[0-9]+-precomposed)?'); // Password managers (1Password, Bitwarden, iCloud Keychain) probe этот URL для passkey // discovery (W3C draft). Без endpoint'а они fall back на password autofill — функционально // не сломано, но 404 в логах. Возвращаем валидный пустой manifest. Route::get('.well-known/passkey-endpoints', function () { return response()->json( ['enroll' => null, 'manage' => null], 200, ['Cache-Control' => 'public, max-age=86400'] ); }); /logo/social.webp` без themes/{theme}/ prefix. // Также social card crawlers (FB/Twitter/Telegram) и Google search index содержат старые // pre-cutover URLs. 301 → текущий theme's asset. $legacyLogoRedirect = function ($file) { $template = strtolower(config('core.template') ?? 't21'); return redirect("/themes/{$template}/logo/{$file}", 301); }; Route::get('logo/{file}', $legacyLogoRedirect) ->where('file', '(social|og_image|twitter|favicon|logo|insthacker)\.(png|webp|jpg|jpeg|svg)'); // iOS Safari + iOS apps + Pinterest crawler автоматически запрашивают эти URLs независимо // от в HTML. 301 → theme's favicon.png (180×180+ ideally). $appleTouchRedirect = function () { $template = strtolower(config('core.template') ?? 't21'); return redirect("/themes/{$template}/logo/favicon.png", 301); }; Route::get('apple-touch-icon{any}.png', $appleTouchRedirect) ->where('any', '(-precomposed|-[0-9]+x[0-9]+|-[0-9]+x[0-9]+-precomposed)?'); // Password managers (1Password, Bitwarden, iCloud Keychain) probe этот URL для passkey // discovery (W3C draft). Без endpoint'а они fall back на password autofill — функционально // не сломано, но 404 в логах. Возвращаем валидный пустой manifest. Route::get('.well-known/passkey-endpoints', function () { return response()->json( ['enroll' => null, 'manage' => null], 200, ['Cache-Control' => 'public, max-age=86400'] ); }); /logo/social.webp` без themes/{theme}/ prefix. // Также social card crawlers (FB/Twitter/Telegram) и Google search index содержат старые // pre-cutover URLs. 301 → текущий theme's asset. $legacyLogoRedirect = function ($file) { $template = strtolower(config('core.template') ?? 't21'); return redirect("/themes/{$template}/logo/{$file}", 301); }; Route::get('logo/{file}', $legacyLogoRedirect) ->where('file', '(social|og_image|twitter|favicon|logo|insthacker)\.(png|webp|jpg|jpeg|svg)'); // iOS Safari + iOS apps + Pinterest crawler автоматически запрашивают эти URLs независимо // от в HTML. 301 → theme's favicon.png (180×180+ ideally). $appleTouchRedirect = function () { $template = strtolower(config('core.template') ?? 't21'); return redirect("/themes/{$template}/logo/favicon.png", 301); }; Route::get('apple-touch-icon{any}.png', $appleTouchRedirect) ->where('any', '(-precomposed|-[0-9]+x[0-9]+|-[0-9]+x[0-9]+-precomposed)?'); // Password managers (1Password, Bitwarden, iCloud Keychain) probe этот URL для passkey // discovery (W3C draft). Без endpoint'а они fall back на password autofill — функционально // не сломано, но 404 в логах. Возвращаем валидный пустой manifest. Route::get('.well-known/passkey-endpoints', function () { return response()->json( ['enroll' => null, 'manage' => null], 200, ['Cache-Control' => 'public, max-age=86400'] ); }); /logo/social.webp` без themes/{theme}/ prefix. // Также social card crawlers (FB/Twitter/Telegram) и Google search index содержат старые // pre-cutover URLs. 301 → текущий theme's asset. $legacyLogoRedirect = function ($file) { $template = strtolower(config('core.template') ?? 't21'); return redirect("/themes/{$template}/logo/{$file}", 301); }; Route::get('logo/{file}', $legacyLogoRedirect) ->where('file', '(social|og_image|twitter|favicon|logo|insthacker)\.(png|webp|jpg|jpeg|svg)'); // iOS Safari + iOS apps + Pinterest crawler автоматически запрашивают эти URLs независимо // от в HTML. 301 → theme's favicon.png (180×180+ ideally). $appleTouchRedirect = function () { $template = strtolower(config('core.template') ?? 't21'); return redirect("/themes/{$template}/logo/favicon.png", 301); }; Route::get('apple-touch-icon{any}.png', $appleTouchRedirect) ->where('any', '(-precomposed|-[0-9]+x[0-9]+|-[0-9]+x[0-9]+-precomposed)?'); // Password managers (1Password, Bitwarden, iCloud Keychain) probe этот URL для passkey // discovery (W3C draft). Без endpoint'а они fall back на password autofill — функционально // не сломано, но 404 в логах. Возвращаем валидный пустой manifest. Route::get('.well-known/passkey-endpoints', function () { return response()->json( ['enroll' => null, 'manage' => null], 200, ['Cache-Control' => 'public, max-age=86400'] ); }); /logo/social.webp` без themes/{theme}/ prefix. // Также social card crawlers (FB/Twitter/Telegram) и Google search index содержат старые // pre-cutover URLs. 301 → текущий theme's asset. $legacyLogoRedirect = function ($file) { $template = strtolower(config('core.template') ?? 't21'); return redirect("/themes/{$template}/logo/{$file}", 301); }; Route::get('logo/{file}', $legacyLogoRedirect) ->where('file', '(social|og_image|twitter|favicon|logo|insthacker)\.(png|webp|jpg|jpeg|svg)'); // iOS Safari + iOS apps + Pinterest crawler автоматически запрашивают эти URLs независимо // от в HTML. 301 → theme's favicon.png (180×180+ ideally). $appleTouchRedirect = function () { $template = strtolower(config('core.template') ?? 't21'); return redirect("/themes/{$template}/logo/favicon.png", 301); }; Route::get('apple-touch-icon{any}.png', $appleTouchRedirect) ->where('any', '(-precomposed|-[0-9]+x[0-9]+|-[0-9]+x[0-9]+-precomposed)?'); // Password managers (1Password, Bitwarden, iCloud Keychain) probe этот URL для passkey // discovery (W3C draft). Без endpoint'а они fall back на password autofill — функционально // не сломано, но 404 в логах. Возвращаем валидный пустой manifest. Route::get('.well-known/passkey-endpoints', function () { return response()->json( ['enroll' => null, 'manage' => null], 200, ['Cache-Control' => 'public, max-age=86400'] ); }); /logo/social.webp` без themes/{theme}/ prefix. // Также social card crawlers (FB/Twitter/Telegram) и Google search index содержат старые // pre-cutover URLs. 301 → текущий theme's asset. $legacyLogoRedirect = function ($file) { $template = strtolower(config('core.template') ?? 't21'); return redirect("/themes/{$template}/logo/{$file}", 301); }; Route::get('logo/{file}', $legacyLogoRedirect) ->where('file', '(social|og_image|twitter|favicon|logo|insthacker)\.(png|webp|jpg|jpeg|svg)'); // iOS Safari + iOS apps + Pinterest crawler автоматически запрашивают эти URLs независимо // от в HTML. 301 → theme's favicon.png (180×180+ ideally). $appleTouchRedirect = function () { $template = strtolower(config('core.template') ?? 't21'); return redirect("/themes/{$template}/logo/favicon.png", 301); }; Route::get('apple-touch-icon{any}.png', $appleTouchRedirect) ->where('any', '(-precomposed|-[0-9]+x[0-9]+|-[0-9]+x[0-9]+-precomposed)?'); // Password managers (1Password, Bitwarden, iCloud Keychain) probe этот URL для passkey // discovery (W3C draft). Без endpoint'а они fall back на password autofill — функционально // не сломано, но 404 в логах. Возвращаем валидный пустой manifest. Route::get('.well-known/passkey-endpoints', function () { return response()->json( ['enroll' => null, 'manage' => null], 200, ['Cache-Control' => 'public, max-age=86400'] ); });
t23:about.9302
t23:about.9304
t23:about.9307
t23:about.9310
t23:about.9312
t23:about.9313
t23:about.9314