/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'] ); }); เกี่ยวกับเรา | InstHacker

t23:about.9300

t23:about.9301

t23:about.9302

t23:about.65106

t23:about.65105

t23:about.65107

t23:about.65108

t23:about.65109

t23:about.65110

t23:about.65111

t23:about.65112

t23:about.9303

t23:about.9304

t23:about.9305  

t23:about.9306

t23:about.9307

t23:about.9308  

t23:about.9309

t23:about.9310

t23:about.9311  

t23:about.9312

t23:about.9313

t23:about.9314

t23:about.9315

t23:about.9316

t23:about.9317

t23:about.9318

t23:about.65113

t23:about.9320

t23:about.65114

t23:about.65115

t23:about.9321

t23:about.9322

t23:about.9324

t23:about.9325

t23:about.9327

t23:about.9328

1