这个是网上很流行的一个nginx的Wordpress伪静态规则

也是lnmp自带的一个规则,乍看上去没什么问题的规则

location / {

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;

        }

}

但仔细看。。。问题很明显了额。。

if (-f $request_filename/index.html){

                rewrite (.*) $1/index.html break;

        }

if (-f $request_filename/index.php){

                rewrite (.*) $1/index.php;

        }

以上两句本意是好的。。。目录下存在index则rewrite到index。。。嗯。。。

但却忽视了。。URL的目录后面不带/的问题

根据相对路径的某些规定。。如果目录后面不带/会导致浏览器解析页面元素时,会把在本应在当前目录下级目录的元素解析到上级目录的下级目录元素

嗯嗯。。。很拗口。。。举个例子

原本a.jpg这个图片,路径是example.com/a/a.jpg。a目录下的index.html引用了这个图片的相对路径/a.jpg

但如果使用example.com/a这样的方式访问目录。。。这个相对路径在浏览器看来就会变成example.com/a.jpg

为了避免这个问题。nginx和其它服务器程序一样会把example.com/a这样的访问目录方式跳转到example.com/a/。。。但不知道为何在启用这个伪静态规则以后就无效了【处理的先后顺序问题?】

解决方法很简单。。在伪静态规则开头处中手动加入跳转

变为:

location / {

if (-d $request_filename){

                rewrite ^/(.*)([^/])$ $1$2/ permanent;

        }

        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;

        }

}