2023年8月

本文介绍百度云主机BCH多域名分别绑定不同子目录实现一机部署多站的nginx配置文件写法之一。

BCH上原有一个example.com绑定在webroot根目录,最近想增加一个newdomain.com,与原来的网站分别放入两个子目录中。阿里云主机可以通过修改Apache.htaccess文件中的rewrite规则实现,想必BCH也能通过修改nginx配置文件实现,于是一番学习nginx配置文件的语法规则。

反复修改webroot目录下的bcloud_nginx_user.conf,怎么都无法实现想要的效果,百思不得其解。怀疑是不是BCH限制了一机多站,于是发工单询问百度技术支持,确认没有做特别限制后,继续探索。根据HTTP响应情况和log文件记录情况逐步调试,最终成功写出了完整的配置文件,实现了预期效果。下面将配置文件内容分享给大家参考。

if ($host ~* (www.)?(example|newdomain).com) {
    set $subsite $2;
}

首先匹配绑定的两个域名example.comnewdomain.com,设置子站标识。同时在webroot目录中创建两个子目录examplenewdomain分别放置两个网站的文件。

location = / {
    root /home/bae/app/$subsite;
    if (-f $request_filename/index.html) {
        rewrite (.*) /$subsite/index.html break;
    }
    if (-f $request_filename/index.php) {
        rewrite (.*) /index.php last;
    }
}

将最常用的首页path=/匹配出来,设置文档根目录为上一步创建的子目录。如果子目录中存在index.html则重定向到子目录,中止匹配;如果子目录中存在index.php则重定向到index.php,继续匹配。

location ~* \.(html|htm|js|css|jpg|jpeg|png|gif|svg|ico) {
    rewrite ^/(.*) /$subsite/$1 break;
}

处理静态文件,全部重定向进入子目录,中止匹配。

location ~* \.php {
    root /home/bae/app/$subsite;
    if (!-f $request_filename) {
        rewrite (.*) /index.php last;
    }
    set $path_info "";
    set $real_script_name $fastcgi_script_name;
    if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
        set $real_script_name $1;
        set $path_info $2;
    }
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
    fastcgi_param SCRIPT_NAME $real_script_name;
    fastcgi_param PATH_INFO $path_info;
    fastcgi_param SERVER_PORT 80;
    include fastcgi_params;
}

处理php脚本文件,把官方文档中关于server级配置中对php文件的处理,直接复制过来进行修改覆盖。增加第2~5行,设置新的文档根目录为子目录,如果脚本不存在,重定向到首页,重新匹配本规则;如果脚本存在,则转交给fastcgi处理。

location ~* ^\/[^\.]*$ {
    root /home/bae/app/$subsite;
    # index index.html index.php;
    if (-f $request_filename/index.html) {
        rewrite (.*) /$subsite$1/index.html break;
    }
    if (-f $request_filename/index.php) {
        rewrite (.*) $1/index.php last;
    }
    if (!-f $request_filename) {
        rewrite (.*) /index.php last;
    }
}

匹配path为二级或多级目录的情形,寻找目录中的index.htmlindex.php,如果找不到也重定向到首页。注意这里不能使用index指令(第3行)设置默认首页文件,会产生循环重定向问题。

将上述代码块组合到一起,就是完整的bcloud_nginx_user.conf文件,放入webroot根目录,重载站点即可。注意要清空控制面板中的默认首页配置,也就是bcloud_nginx_gen.conf中不能有重复的location匹配,不然会产生冲突。