客户网站要求实现全站静态化,我们经过调查选择了 staticpress2019 这个插件。实验阶段这个插件表现完美,生成的静态网站表现和动态完全一样。

然而去客户处部署后,发现出了问题:静态网站首页生成正常,但是打开文章报错,更具体是打开包含图片或视频的文章报错,纯文本的没事。

开始以为是媒体文件名称含中文的原因,可是改成拼音后,生成的静态网站依然报错。

仔细分析生成的静态文件,发现很多html被生成成了文件夹,而不是文件。文件夹内部是图片的网页文件。所以浏览器访问这个html时候,实际是访问服务器上面的文件夹,而此文件夹内没有 index.html 导致直接报错403 Forbiden。

查数据,看网站后台,调查很久,终于想通了原因。首先发现媒体库中的每个媒体也都有固定链接,而这些固定链接不知道为什么是其引用文章后面的链接。例如,文章 123.html 中包括图片 xyz.jpg,那么 xyz 这个媒体文件的固定链接就是 域名/123.html/xyz 。而观察 staticpress2019 生成静态文件时候的 log,它是先生成的媒体的固定链接,在生成文件的固定链接。导致 /123.html/ 提前被生成了目录,而后再生成 123.tml 文件时候就失败了,然而 staticpress2029 会忽略继续后面的生成,最后导致了前面的问题。

知道了原因,但是如何解决呢。又浪费了不少脑细胞,想明白了。是固定链接的问题。固定链接为了对搜索引擎友好设置成了 %postid%.html ,所以文章的固定链接就都是 123.html 这种形式。最简单的修改就是把固定链接改成 %postid%这种形式。这样 123 会被生成目录,但是内部会生成 index.html。前面的媒体文件的固定链接依然会被提前生成,不过不会影响后面 index.html 的生成,这样静态网站就正常了。

尽管是解决了,但是媒体的固定链接为什么是 域名/文章链接/媒体名 这种形式,还是没搞明白。我看了其它网站的媒体固定链接,直接就是 域名/媒体名 ,这样的话,staticpress2019 也不会生成错误。