解决方案
使用Nginx时Typecho的内部伪静态在虚拟主机下会404,可能需要配置伪静态规则,我本身就没学过nginx的配置,看了网上的方法大多是这样加
if (-f $request_filename/index.html){
rewrite (.*) $1/index.html break;
}
if (-f $request_filename/index.php){
rewrite (.*) $1/index.php;
}
if (!-f $request_filename){
rewrite (.*) /index.php;
}
这样无论是后台还是文章都会404
也有人换过来这样加
if (-f $request_filename/index.php){
rewrite (.*) $1/index.php;
}
if (-f $request_filename/index.html){
rewrite (.*) $1/index.html break;
}
if (!-e $request_filename){
rewrite (.*) /index.php;
}
但这样只能进后台
最终解决
最终再次调换了顺序,调成这样子就行了
if (-f $request_filename/index.php){
rewrite (.*) $1/index.php;
}
if (!-e $request_filename){
rewrite (.*) /index.php;
}
if (-f $request_filename/index.html){
rewrite (.*) $1/index.html break;
}
原因分析
虽然原因还不清楚,毕竟也不太关心配置问题,但通过查阅文档,有了简单的猜想-f $request_filename/index.php(重写目录)和!-e $request_filename(重写至index.php)是将目录和文件重写,而且顺序永远是一前一后,但-f $request_filename/index.html的相对位置总会变,所以问题应该出在这里,是什么东西让-f $request_filename/index.html的条件为真,但是typecho的程序里默认是没有.html的。不同环境可能情况不同,想要弄清楚只能调试,也没有必要。写这篇文章的时候我又在想,现在typecho的路由格式大多数都是index.php加上路径,那是不是只需要第一条就可以了?我试了一下,还真是,但是当目录不存在时不会被重写至index.php导致无法使用typecho的404页面。然后我又想index.html那一条平常压根没用,还会导致出错,那我直接删了不行?删了之后使用typecho没有任何区别,但可能涉及html时会出错,这也更加确定了就是第三条影响了结果,至于它为什么会运行也不得而知。