Nginx下如何重写WordPress上传目录中无扩展名/仅带点结尾的图片URL?
Nginx下如何重写WordPress上传目录中无扩展名/仅带点结尾的图片URL?
老哥,我太懂你这种糟心处境了——上传目录乱成一锅粥,改数据库和批量加扩展名又怕搞出幺蛾子,用Nginx重写确实是最稳妥的快速解决方案。我给你一套针对性的配置,分两步搞定末尾带点和无扩展名的图片请求,让浏览器乖乖显示图片而不是弹下载框,还能顺便解决缓存问题:
第一步:先统一清理末尾带点的URL
首先处理那些末尾挂着.的奇葩请求,把多余的点去掉,这样后面就能统一处理无扩展名的情况了。在你的Nginx配置的server块里加上这段规则:
# 去掉上传目录中URL末尾的点 rewrite ^(/wp-content/uploads/2024/[^/.]+)\.$ $1 permanent;
这段会把/wp-content/uploads/2024/image.这类请求永久重定向到/wp-content/uploads/2024/image,既统一了请求格式,还不会影响SEO(永久重定向是会传递权重的)。
第二步:处理无扩展名的图片请求,让浏览器识别为图片
接下来针对无扩展名的请求,我们要让Nginx找到对应的文件,同时强制告诉浏览器“这是图片,别下载”,顺便开启缓存优化。在刚才的规则下面补上这段配置:
location ^~ /wp-content/uploads/2024/ { # 先处理正常带扩展名的图片请求 try_files $uri $uri/ @handle_no_ext_images; # 开启图片长期缓存,解决缓存缺失问题,对SEO更友好 expires 30d; add_header Cache-Control "public, immutable"; } location @handle_no_ext_images { # 先尝试按JPEG格式返回(如果你的图片大多是JPG,可调整顺序) if (-f $request_filename) { default_type image/jpeg; break; } # 再尝试PNG格式 if (-f $request_filename) { default_type image/png; break; } # 最后尝试WebP格式 if (-f $request_filename) { default_type image/webp; break; } # 理论上你说目录里只有图片,这步大概率用不上 return 404; }
额外说明
- 配置改完后记得重启Nginx生效:
sudo systemctl restart nginx - 如果你的图片还有GIF这类格式,直接在
@handle_no_ext_images里再加一段default_type image/gif;的判断就行 - 你说目录里只有图片,所以上面的规则完全够用,不用额外加复杂的文件类型检测——要是真担心误匹配,其实也可以再加文件头判断,但完全没必要多此一举
备注:内容来源于stack exchange,提问作者Johnny Bravo
相关产品推荐
相关产品推荐

