Apache服务器(.htaccess)重写外部图片URL问题求助
解决Apache+WordPress下CDN非WebP图片重写至代理URL的问题
原规则失效原因
你当前的.htaccess规则里,RewriteCond %{REQUEST_FILENAME}.jpg -f这类条件是检查本地服务器是否存在对应文件,但你的图片都存储在DigitalOcean Spaces CDN上,本地服务器并没有这些文件,导致条件永远不成立,规则自然无法触发。
解决方案分两种场景处理
场景1:图片URL为本地路径(如/wp-content/uploads/2024/05/xxx.png)
这类请求会经过你的Apache服务器,可以修改.htaccess规则,直接匹配图片格式并代理,无需检查本地文件:
<IfModule mod_rewrite.c> RewriteEngine On # 仅对支持WebP的浏览器生效 RewriteCond %{HTTP_ACCEPT} image/webp # 匹配所有非WebP的图片格式(可按需添加gif等其他格式) RewriteRule \.(jpg|jpeg|png)$ https://proxied-url/converttowebp/https://halorumah.sgp1.digitaloceanspaces.com%{REQUEST_URI} [P,L] </IfModule>
注意:确保Apache已启用mod_rewrite、mod_proxy和mod_proxy_http模块,Ubuntu/Debian系统可通过以下命令启用:
a2enmod rewrite proxy proxy_http systemctl restart apache2
场景2:图片URL为完整CDN域名(如https://halorumah.sgp1.digitaloceanspaces.com/wp-content/xxx.png)
这类请求会直接访问CDN,不会经过你的Apache服务器,.htaccess无法拦截,需通过WordPress代码替换URL:
在主题的functions.php文件中添加以下代码:
// 替换文章内容中的CDN非WebP图片URL add_filter('the_content', 'replace_non_webp_cdn_images'); function replace_non_webp_cdn_images($content) { $cdn_base = 'https://halorumah.sgp1.digitaloceanspaces.com'; $proxy_base = 'https://proxied-url/converttowebp'; // 匹配CDN下的jpg/jpeg/png图片 $pattern = '/' . preg_quote($cdn_base, '/') . '(\/wp-content\/.*?\.(jpg|jpeg|png))/i'; $replacement = $proxy_base . '$0'; return preg_replace($pattern, $replacement, $content); } // 替换附件图片的CDN URL add_filter('wp_get_attachment_image_src', 'replace_attachment_cdn_url', 10, 4); function replace_attachment_cdn_url($image_data, $attachment_id, $size, $icon) { $cdn_base = 'https://halorumah.sgp1.digitaloceanspaces.com'; $proxy_base = 'https://proxied-url/converttowebp'; if (strpos($image_data[0], $cdn_base) !== false && !preg_match('/\.webp$/i', $image_data[0])) { $image_data[0] = $proxy_base . $image_data[0]; } return $image_data; }
内容的提问来源于stack exchange,提问作者Loderunner
相关产品推荐
相关产品推荐

