我正在开展一个项目,其中有两个域名:imagedomain.com 和 i.imagedomain.com。主域名 (imagedomain.com) 处理用户交互和访问逻辑,而子域名 (i.imaged...
我正在开发一个项目,其中有两个域名:imagedomain.com 和 i.imagedomain.com。主域名 (imagedomain.com) 处理用户交互和访问逻辑,而子域名 (i.imagedomain.com) 提供实际的图像文件。但是,当我尝试提供嵌入图像时,我遇到了重定向循环和不正确的 referer 处理问题。
问题 重定向循环:有时,当尝试访问图像时,浏览器会卡在重定向循环中。错误的 Referer 处理:嵌入的图像有时被视为直接访问,从而导致不必要的重定向。
设置详细信息imagedomain.com 处理访问逻辑并redirects.i.imagedomain.com 提供实际的图像文件,存储在 S3 兼容服务(Wasabi)上。
我已尝试 确保已进行引荐来源检查以区分合法的嵌入式请求和直接访问。我确认 i.imagedomain.com 配置为直接提供图像而没有任何不必要的重定向。
我如何才能像 Imgur 那样正确地提供来自 i.imagedomain.com 的嵌入图像,而不会触发重定向循环或将其误认为直接访问?可以对 .htaccess 和 PHP 脚本进行哪些改进以确保能够可靠地处理这些情况?
任何帮助或指导都将不胜感激!
SetupOn imagedomain.com,我有以下.htaccess 规则,将图像请求重定向到 PHP 脚本:
重写引擎开启
# Match image and video file requests
RewriteCond %{REQUEST_URI} \.(jpg|jpeg|png|gif|mp4|webm|bmp|tiff|svg)$ [NC]
# Avoid redirect loops by skipping requests already handled by image-proxy.php
RewriteCond %{REQUEST_URI} !/image-proxy.php$ [NC]
# Redirect all other image requests to the proxy script
RewriteRule ^(.*)\.(jpg|jpeg|png|gif|mp4|webm|bmp|tiff|svg)$ /image-proxy.php?image=$1 [QSA,L]
这是用于决定是否直接提供图像或重定向的 PHP 脚本(image-proxy.php):
<?php
// Get the image name from the URL
$imageName = basename($_GET['image']);
// Get the referer header
$referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '';
// Initialize the direct access flag
$isDirectAccess = false;
// Perform referer checks
if (empty($referer)) {
// No referer typically means direct access (e.g., user entering the URL directly)
$isDirectAccess = true;
} else {
// Parse the referer domain
$refererDomain = parse_url($referer, PHP_URL_HOST);
if ($refererDomain !== false) {
if (strpos($refererDomain, 'imagedomain.com') !== false) {
// Legitimate request from within your domain (e.g., embedded images)
$isDirectAccess = false;
} else {
// Referer from an external domain - likely direct access from elsewhere
$isDirectAccess = true;
}
} else {
// Could not parse the referer domain - treat cautiously as direct access
$isDirectAccess = true;
}
}
// Handle the request based on the checks
if ($isDirectAccess) {
// Redirect to the image's page on your site
header("Location: https://imagedomain.com/" . urlencode($imageName), true, 301);
exit();
} else {
// Serve the image directly from Wasabi (for embedded images and internal links)
$wasabiUrl = "https://i.imagedomain.com.s3.wasabisys.com/" . $imageName;
// Open the file on Wasabi to serve it
$fileHandle = @fopen($wasabiUrl, 'rb');
if ($fileHandle) {
// Determine the MIME type by reading the file headers from Wasabi
$fileHeaders = stream_get_meta_data($fileHandle);
foreach ($fileHeaders['wrapper_data'] as $header) {
if (stripos($header, 'Content-Type:') === 0) {
header($header);
break;
}
}
// Serve the file content
fpassthru($fileHandle);
fclose($fileHandle);
} else {
// If the image is not found, return a 404 error
header("HTTP/1.0 404 Not Found");
echo "Image not found.";
}
exit();
}