fix(seo,performance): disallow bot media streaming, disable fastcgi buffering, and resolve real cloudflare client IPs
This commit is contained in:
@@ -27,7 +27,7 @@ class BotDetector
|
|||||||
|
|
||||||
// Bu IP prefix'leri için tüm kontroller atlanır (güvenilir crawler'lar)
|
// Bu IP prefix'leri için tüm kontroller atlanır (güvenilir crawler'lar)
|
||||||
private const TRUSTED_IP_PREFIXES = [
|
private const TRUSTED_IP_PREFIXES = [
|
||||||
'66.249.', // Googlebot
|
'66.249.', // Googlebot IPv4
|
||||||
'64.233.', // Google
|
'64.233.', // Google
|
||||||
'74.125.', // Google
|
'74.125.', // Google
|
||||||
'209.85.', // Google
|
'209.85.', // Google
|
||||||
@@ -36,6 +36,8 @@ class BotDetector
|
|||||||
'34.64.', // Google Cloud
|
'34.64.', // Google Cloud
|
||||||
'35.187.', // Google Cloud
|
'35.187.', // Google Cloud
|
||||||
'35.190.', // Google Cloud
|
'35.190.', // Google Cloud
|
||||||
|
'2001:4860:', // Googlebot IPv6
|
||||||
|
'2a00:1450:', // Google IPv6
|
||||||
];
|
];
|
||||||
|
|
||||||
// İzin ver ama bot olarak işaretle (SEO crawler'lar)
|
// İzin ver ama bot olarak işaretle (SEO crawler'lar)
|
||||||
@@ -80,7 +82,12 @@ class BotDetector
|
|||||||
|
|
||||||
public function handle(Request $request, Closure $next)
|
public function handle(Request $request, Closure $next)
|
||||||
{
|
{
|
||||||
$ip = $request->ip();
|
// Cloudflare / proxy arkasındaki gerçek istemci IP'sini tespit et
|
||||||
|
$cfIp = $request->header('CF-Connecting-IP')
|
||||||
|
?: ($request->header('True-Client-IP')
|
||||||
|
?: ($request->header('X-Forwarded-For') ? trim(explode(',', $request->header('X-Forwarded-For'))[0]) : null));
|
||||||
|
$ip = $cfIp ?: $request->ip();
|
||||||
|
|
||||||
$ua = strtolower($request->userAgent() ?? '');
|
$ua = strtolower($request->userAgent() ?? '');
|
||||||
$path = '/' . ltrim($request->path(), '/');
|
$path = '/' . ltrim($request->path(), '/');
|
||||||
|
|
||||||
@@ -89,7 +96,23 @@ class BotDetector
|
|||||||
$path = '/' . substr($path, 11);
|
$path = '/' . substr($path, 11);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Skip paths
|
// Botların video parçalarını ve m3u8 playlistlerini boşuna taramasını engelle (CPU / FastCGI koruması)
|
||||||
|
$isBotCandidate = false;
|
||||||
|
if (!empty($ua)) {
|
||||||
|
foreach (array_merge(self::BAD_BOTS, self::GOOD_BOTS, self::GENERIC_BOTS) as $botPattern) {
|
||||||
|
if (str_contains($ua, $botPattern)) {
|
||||||
|
$isBotCandidate = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($isBotCandidate && (str_starts_with($path, '/stream/') || str_starts_with($path, '/vtt-proxy'))) {
|
||||||
|
return response('No bot indexing allowed on media streams.', 403, [
|
||||||
|
'X-Robots-Tag' => 'noindex, nofollow, noarchive',
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Skip paths (medya, tracking vb. insan trafiği için rate limit muafiyeti)
|
||||||
foreach (self::SKIP_PATHS as $skip) {
|
foreach (self::SKIP_PATHS as $skip) {
|
||||||
if (str_starts_with($path, $skip)) {
|
if (str_starts_with($path, $skip)) {
|
||||||
return $next($request);
|
return $next($request);
|
||||||
|
|||||||
@@ -11,8 +11,12 @@ Disallow: /watchlist
|
|||||||
Disallow: /notifications
|
Disallow: /notifications
|
||||||
Disallow: /ai
|
Disallow: /ai
|
||||||
Disallow: /watch/
|
Disallow: /watch/
|
||||||
|
Disallow: /stream/
|
||||||
|
Disallow: /index.php/stream/
|
||||||
Disallow: /vtt-proxy
|
Disallow: /vtt-proxy
|
||||||
Disallow: /track/
|
Disallow: /track/
|
||||||
|
Disallow: /calls/
|
||||||
|
Disallow: /episode/
|
||||||
Disallow: /comments
|
Disallow: /comments
|
||||||
Crawl-delay: 1
|
Crawl-delay: 1
|
||||||
|
|
||||||
@@ -20,11 +24,25 @@ User-agent: Googlebot
|
|||||||
Allow: /
|
Allow: /
|
||||||
Disallow: /admin/
|
Disallow: /admin/
|
||||||
Disallow: /api/
|
Disallow: /api/
|
||||||
|
Disallow: /stream/
|
||||||
|
Disallow: /index.php/stream/
|
||||||
|
Disallow: /vtt-proxy
|
||||||
|
Disallow: /track/
|
||||||
|
Disallow: /calls/
|
||||||
|
Disallow: /episode/
|
||||||
|
Disallow: /comments
|
||||||
|
|
||||||
User-agent: Bingbot
|
User-agent: Bingbot
|
||||||
Allow: /
|
Allow: /
|
||||||
Disallow: /admin/
|
Disallow: /admin/
|
||||||
Disallow: /api/
|
Disallow: /api/
|
||||||
|
Disallow: /stream/
|
||||||
|
Disallow: /index.php/stream/
|
||||||
|
Disallow: /vtt-proxy
|
||||||
|
Disallow: /track/
|
||||||
|
Disallow: /calls/
|
||||||
|
Disallow: /episode/
|
||||||
|
Disallow: /comments
|
||||||
|
|
||||||
# AI eğitim botlarını engelle (standart User-agent yöntemi)
|
# AI eğitim botlarını engelle (standart User-agent yöntemi)
|
||||||
User-agent: GPTBot
|
User-agent: GPTBot
|
||||||
|
|||||||
@@ -554,6 +554,8 @@ Route::get("/stream/proxy", function (\Illuminate\Http\Request $request) {
|
|||||||
"Content-Type" => "video/mp4",
|
"Content-Type" => "video/mp4",
|
||||||
"Access-Control-Allow-Origin" => "*",
|
"Access-Control-Allow-Origin" => "*",
|
||||||
"Cache-Control" => "public, max-age=86400",
|
"Cache-Control" => "public, max-age=86400",
|
||||||
|
"X-Accel-Buffering" => "no",
|
||||||
|
"X-Robots-Tag" => "noindex, nofollow, noarchive",
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -663,6 +665,8 @@ Route::get("/stream/proxy", function (\Illuminate\Http\Request $request) {
|
|||||||
"Content-Type" => "application/vnd.apple.mpegurl; charset=utf-8",
|
"Content-Type" => "application/vnd.apple.mpegurl; charset=utf-8",
|
||||||
"Access-Control-Allow-Origin" => "*",
|
"Access-Control-Allow-Origin" => "*",
|
||||||
"Cache-Control" => "no-cache, no-store",
|
"Cache-Control" => "no-cache, no-store",
|
||||||
|
"X-Accel-Buffering" => "no",
|
||||||
|
"X-Robots-Tag" => "noindex, nofollow, noarchive",
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -676,6 +680,8 @@ Route::get("/stream/proxy", function (\Illuminate\Http\Request $request) {
|
|||||||
"Content-Type" => $segCt ?: "video/mp2t",
|
"Content-Type" => $segCt ?: "video/mp2t",
|
||||||
"Access-Control-Allow-Origin" => "*",
|
"Access-Control-Allow-Origin" => "*",
|
||||||
"Cache-Control" => "public, max-age=3600",
|
"Cache-Control" => "public, max-age=3600",
|
||||||
|
"X-Accel-Buffering" => "no",
|
||||||
|
"X-Robots-Tag" => "noindex, nofollow, noarchive",
|
||||||
]);
|
]);
|
||||||
})->name("stream.proxy");
|
})->name("stream.proxy");
|
||||||
|
|
||||||
@@ -714,6 +720,8 @@ Route::get("/stream/seg", function (\Illuminate\Http\Request $request) {
|
|||||||
'Content-Length' => $size,
|
'Content-Length' => $size,
|
||||||
'Access-Control-Allow-Origin' => '*',
|
'Access-Control-Allow-Origin' => '*',
|
||||||
'Cache-Control' => 'public, max-age=86400',
|
'Cache-Control' => 'public, max-age=86400',
|
||||||
|
'X-Accel-Buffering' => 'no',
|
||||||
|
'X-Robots-Tag' => 'noindex, nofollow, noarchive',
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -794,6 +802,8 @@ Route::get("/stream/seg", function (\Illuminate\Http\Request $request) {
|
|||||||
'Content-Length' => strlen($content),
|
'Content-Length' => strlen($content),
|
||||||
'Access-Control-Allow-Origin' => '*',
|
'Access-Control-Allow-Origin' => '*',
|
||||||
'Cache-Control' => 'public, max-age=86400',
|
'Cache-Control' => 'public, max-age=86400',
|
||||||
|
'X-Accel-Buffering' => 'no',
|
||||||
|
'X-Robots-Tag' => 'noindex, nofollow, noarchive',
|
||||||
]);
|
]);
|
||||||
})->name('stream.seg');
|
})->name('stream.seg');
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user