Apache URL重写按需触发PHP生成缩略图:请求不存在的缩略图时,内部重写至createthumb.php,校验路径、读原图、生成并输出缩略图,支持缓存优化。

Apache 中 URL 重写将原始大图路径实时映射到缩略图生成服务,核心是“按需触发 PHP 处理”,而非直接转发文件。关键在于:当请求一个不存在的缩略图 URL 时,Apache 不返回 404,而是内部重写到 PHP 脚本(如 createthumb.php),由它读取原图、生成缩略图、输出并可选缓存。
确保 rewrite 模块已启用并授权
跳过任一环节,.htaccess 规则都不会生效:
- 运行
apache2ctl -M | grep rewrite,确认输出含rewrite_module (shared) - 在对应虚拟主机配置中(如
/etc/apache2/sites-available/000-default.conf),找到<directory></directory>区块 - 把
AllowOverride None改为AllowOverride All - 建议加上
Options FollowSymLinks(部分旧版本必需) - 执行
sudo systemctl restart apache2生效
设计缩略图 URL 格式并编写重写规则
推荐使用清晰、可读的路径格式,例如:https://example.com/thumb/upload/news/2023/01/abc.jpg?w=200&h=150
或更简洁的伪静态风格:https://example.com/thumb/upload/news/2023/01/abc.jpg!200x150
在网站根目录或图片目录下创建 .htaccess,写入:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^thumb/(.+)\.([a-zA-Z]{3,4})!(\d+)x(\d+)$ /createthumb.php?src=$1.$2&w=$3&h=$4 [L,QSA]
说明:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
RewriteCond !-f和!-d确保只对**不存在的文件**触发重写(避免覆盖真实缩略图) - 正则捕获源图路径
$1.$2和尺寸$3×$4 -
[QSA]保留其他查询参数(如质量、裁剪模式等) -
[L]终止后续规则匹配
PHP 缩略图脚本需完成三件事
createthumb.php 必须能:
- 安全解析
$_GET['src'],校验路径合法性(禁止目录遍历,如用realpath()+ 白名单前缀比对) - 检查源图是否存在、可读,且为支持的图片类型(
jpg/jpeg/png/gif) - 调用 GD 或 Imagick 生成缩略图,设置正确
Content-Type(如image/jpeg),并输出二进制流 - (可选)生成后保存到磁盘同名路径,下次请求直接由 Apache 返回,不走 PHP
示例逻辑片段:
if (file_exists($src) && is_readable($src)) {
$img = imagecreatefromjpeg($src);
$thumb = imagescale($img, $w, $h, IMG_BILINEAR_FIXED);
header('Content-Type: image/jpeg');
imagejpeg($thumb, null, 85);
}
注意缓存与性能边界
这类方案适合中小流量场景。高频访问时需补充:
- 在 PHP 脚本开头加
header('Cache-Control: public, max-age=86400');,让 CDN 或浏览器缓存结果 - 生成缩略图后,用
file_put_contents($thumb_path, $output)写入磁盘,后续请求由 Apache 直接服务(无需 PHP) - 避免在重写规则中匹配所有图片(如
^.*\.(jpg|png)$),否则会干扰真实资源;务必用^thumb/...这类明确前缀隔离 - 生产环境禁用
display_errors,防止 PHP 错误暴露路径或配置










