现在有部分用户在建站的时候,根目录下已经运行了一份程序代码,并且设置了伪静态。为了增加网站的收录量,还会给网站增加站内站的功能。一般没有开发能力的用户,会选择在一级目录下再按照一个WordPress来作为站内站发一些不太紧要的文章。这里说说如何给安装在一级目录下的WordPress程序设置nginx伪静态规则问题。如果伪静态设置不当的话,会导致网站不能正常打开。要么就是影响到了原来的网站,导致原来网站内页打不开,要么就是影响到了WordPress站点,导致站内站内页打不开,或者设置不当导致内页能打开了,后台却有打不开了的情况。

这里的配置方法适合使用nginx作为服务器环境的用户配置,如果你使用的宝塔面板,那么配置起来将更方便。下面以使用宝塔面板来说明一级目录下安装WordPress的nginx伪静态规则配置方法。没有使用宝塔面板,直接配置nginx.conf也是一样的配置内容,只是操作方法略有不同,需要手动打开nginx.conf,并在修改完毕后,手动重启或重载nginx。

WordPress原来的伪静态规则

location /
{
    try_files $uri $uri/ /index.php?$args;
}

rewrite /wp-admin$ $scheme://$host$uri/ permanent;

上面是WordPress安装在根目录下的nginx伪静态配置,然而,如果直接将它当做安装在一级目录下的WordPress使用的话,它是不行的。我们现在假设已经安装在根目录下的伪静态是:

location /
{
    try_files $uri $uri/ /index.php?$args;
}

正常情况下,我们给源站增加一个站内站,是不能影响网站的正常访问的,要不然,这么增加就没有意义了。

现在假设我们的WordPress安装的一级目录为blog,并且已经安装完毕,那么,我们现在来开始给它配置新的伪静态规则。

一级目录下的WordPress伪静态规则:

location /blog {
    set $need 0;
    if (!-f $request_filename){
        set $need 1;
    }
    if ($request_uri ~* admin){
        set $need 0;
    }
    if ($need = 1) {
        rewrite (.*) /blog/index.php;
    }
    rewrite /blog/wp-admin$ $scheme://$host$uri/ permanent;
}

为什么要这么写呢?因为如果我们这里再使用 try_files $uri $uri/ /index.php?$args;,它就会让安装在根目录下的站点无法正常访问。而如果我们直接使用if (!-f $request_filename){ rewrite (.*) /index.php; },则又会导致安装的一级目录下的后台无法正常访问,因为后台wp-admin是一个真实存在的目录,是不需要伪静态规则的。因此这里我们引入了$need 变量,先判断文件是否存在,如果不存在,我们先标记为$need = 1,再判断路径是不是wp-admin,如果是,则$need = 0,保证rewrite (.*) /blog/index.php;伪静态不会影响到后台,否则就前功尽弃了。

最后,我们再判断$need是否是1,是的话,就执行rewrite (.*) /blog/index.php;,这样既保证了安装在根目录的源站可以正常访问,同时也保证了安装在一级目录下的WordPress站点可以正常访问,WordPress后台也不出错。

但是

一级目录下的WordPress另一种伪静态规则

location /blog {
    try_files $uri $uri/ /blog/index.php?$args;

    rewrite /blog/wp-admin$ $scheme://$host$uri/ permanent;
}

这样写也是正确的。上面两个伪静态规则,都经过了实际测试。如果你也遇到了将WordPress安装在一级目录而网站不能正常访问的话,可以使用上面的伪静态规则。

注意:如果你发现源站无法正常访问内页了,一定是因为源站的伪静态规则被你删掉了。请恢复它。这里新增的一级目录伪静态规则限定了目录作用域,不会影响到源站本身的。