因为 DedeCMS 收费的原因,通过“我爱水煮鱼”博客分享的 “DedeCMS 自动迁移到 WordPress 插件”,将原来的网站迁移到了 WordPress 上,这样就完美的实现了文章 ID 及 URL 不变的无缝迁移。但是实际访问过程中发现文章中的图片都无法显示了。

首先想到的是将原来 DedeCMS 网站的 uploads 文件夹,复制过来放到 WordPress 网站根目录下。

但是再次访问仍然无法显示图片,这时图片已经都复制过来并且路径正确了。

经过仔细排查,原来是 WordPress 多站点模式在 Nginx 上的伪静态规则出了问题。

rewrite ^/([_0-9a-zA-Z-]+/)?wp-admin$ /$1wp-admin/ permanent;
rewrite ^/([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) /$2 last;
rewrite ^/([_0-9a-zA-Z-]+/)?(.*.php)$ /$2 last;
rewrite /. /index.php last;

上面的伪静态规则,最后一条,会匹配到所有根目录下的路径并且重写到 index.php 后面,这样就造成了 /uploads/* 被重写到了 index.php/uploads/*,路径就错了,当然无法显示图片。

知道问题解决起来就简单了,Nginx 提供了 -e 来判断是否是真实存在文件或目录以及 break 语句来终止匹配,在伪静态规则中最后一行前加入下面红色代码即可。

rewrite ^/([_0-9a-zA-Z-]+/)?wp-admin$ /$1wp-admin/ permanent;
rewrite ^/([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) /$2 last;
rewrite ^/([_0-9a-zA-Z-]+/)?(.*.php)$ /$2 last;
if (-e $request_filename){
	break;
}
rewrite /. /index.php last;