效果展示:
可能部分场景会不适用,自测
API介绍:
http://域名/分类名 #直接访问即可返回图片
采用用本地图片+别的api混用的方式,以此实现更多的图源,自己的图暂时不够也不怕,把别人的链接添加进来就可以了!!
使用方法
1.在根目录创建 index.php,并将以下代码复制到里面
<?php
// 多分类随机图片API - 直接通过域名/分类 访问
error_reporting(E_ALL);
ini_set('display_errors', 1);
// 调试模式
$debug = false;
// 检查并定义GLOB_BRACE常量(如果未定义)
if (!defined('GLOB_BRACE')) {
define('GLOB_BRACE', 16);
}
// 第三方API配置(分类名 => API地址)
$thirdPartyApis = [
'动漫' => 'https://t.alcy.cc/pc',
'壁纸' => 'https://t.alcy.cc/pc',
// 可添加更多分类和对应API
];
// 配置图片目录和访问URL
$imageBaseDir = __DIR__ . '/images';
$imageBaseUrl = '/images'; // 图片目录对应的URL路径
// 从URL路径中提取分类
$requestUri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$pathParts = explode('/', trim(str_replace('/index.php', '', $requestUri), '/'));
$category = $pathParts[0] ?? '';
// 关键修改:对分类名进行URL解码
$category = urldecode($category);
// 错误处理
if (empty($category)) {
http_response_code(400);
die('请指定图片分类,例如: /动漫, /头像');
}
$categoryDir = $imageBaseDir . '/' . $category;
if (!is_dir($categoryDir) && !isset($thirdPartyApis[$category])) {
http_response_code(404);
die("分类 '$category' 不存在");
}
// 收集可用的图片来源
$availableSources = [];
// 添加本地图片来源(如果目录存在)
$localImages = [];
if (is_dir($categoryDir)) {
foreach (['jpg', 'jpeg', 'png', 'gif'] as $ext) {
$localImages = array_merge($localImages, glob($categoryDir . "/*.$ext"));
}
if (!empty($localImages)) {
$availableSources['local'] = $localImages;
}
}
// 添加第三方API来源(如果配置存在)
if (isset($thirdPartyApis[$category])) {
$availableSources['api'] = $thirdPartyApis[$category];
}
// 检查是否有可用来源
if (empty($availableSources)) {
http_response_code(404);
die("分类 '$category' 下没有找到图片");
}
// 随机选择来源
$sourceType = array_rand($availableSources);
// 调试输出
if ($debug) {
echo "可用来源: " . implode(', ', array_keys($availableSources)) . "<br>";
echo "随机选择的来源: $sourceType<br>";
}
// 根据选择的来源处理请求
if ($sourceType === 'local') {
// 使用本地图片
$randomImage = $availableSources['local'][array_rand($availableSources['local'])];
// 获取图片文件名和扩展名
$fileName = basename($randomImage);
$fileExt = pathinfo($fileName, PATHINFO_EXTENSION);
// 如果请求中包含图片名称,使用它;否则生成一个随机编号
$displayName = !empty($requestedImageName)
? pathinfo($requestedImageName, PATHINFO_FILENAME) . ".$fileExt"
: sprintf("%02d.%s", rand(1, 99), $fileExt);
// 构建固定格式的图片URL
$imageUrl = "/{$category}/{$displayName}";
// 调试输出
if ($debug) {
echo "分类目录: $categoryDir<br>";
echo "找到 " . count($localImages) . " 张图片<br>";
echo "随机选择: $randomImage<br>";
echo "显示名称: $displayName<br>";
echo "图片URL: $imageUrl<br>";
die();
}
// 重定向到随机选择的真实图片
header("Location: {$imageBaseUrl}/{$category}/{$fileName}");
exit;
} else {
// 使用第三方API
$apiUrl = $availableSources['api'];
// 使用cURL获取第三方API内容
$ch = curl_init($apiUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10); // 设置超时时间
// 执行请求
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$contentType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
curl_close($ch);
// 调试输出
if ($debug) {
echo "API地址: $apiUrl<br>";
echo "HTTP状态码: $httpCode<br>";
echo "内容类型: " . ($contentType ?: '未知') . "<br>";
echo "响应大小: " . (strlen($response) ?: '0') . " 字节<br>";
die();
}
// 检查请求是否成功
if ($httpCode == 200 && $response) {
// 生成一个固定格式的URL
$displayName = sprintf("%02d.jpg", rand(1, 99));
$imageUrl = "/{$category}/{$displayName}";
// 重定向到第三方API
header("Location: {$apiUrl}");
exit;
}
// 如果API请求失败,尝试使用本地图片(如果有)
if (!empty($localImages)) {
$randomImage = $localImages[array_rand($localImages)];
$fileName = basename($randomImage);
// 重定向到本地图片
header("Location: {$imageBaseUrl}/{$category}/{$fileName}");
exit;
}
// 所有尝试都失败
http_response_code(404);
die("无法获取分类 '$category' 下的图片");
}
?>2.根目录创建images件夹,再在images下创建分类,如动漫、壁纸等,每个分类下的图片会被自动识别。
例如:
images/
├── 动漫/
├── 头像/
├── 风景/
├── 游戏/
├── 壁纸/
└── 摄影/
修改 Nginx 配置文件(参考)
1. root指令位置调整
原配置:
nginx
root /www/sites/api/index;
location ~ [^/]\.php(/|$) {
# ...
}
修改后:
nginx
location / {
root /www/sites/api/index; # 将root移至location块内
}
作用:
明确指定root作用范围,确保所有请求都从正确的目录读取文件。
2. 添加 URL 重写规则
新增配置:
nginx
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
作用:
当请求的文件或目录不存在时,将请求转发给index.php处理,这是实现域名/分类访问的核心配置。
3. 优化 PHP 处理规则
原配置:
nginx
location ~ [^/]\.php(/|$) {
# 复杂的PATH_INFO处理逻辑
}
修改后:
nginx
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
# ...
}
作用:
使用更简洁的正则表达式匹配所有 PHP 文件
通过
fastcgi_split_path_info自动处理 PATH_INFO,避免手动编写复杂的if逻辑
4. 安全增强
新增配置:
nginx
if (!-f $document_root$fastcgi_script_name) {
return 404;
}
作用:
防止攻击者通过不存在的 PHP 文件路径进行探测或攻击。
5. 静态文件处理优化
新增配置:
nginx
location / {
# 静态文件直接返回
}
作用:
优先处理静态文件请求,提高性能。
总结
https://域名/分类名 每次都会随机一张图片
评论区