WordPress 骨架、VVV、多站点和正确的 Nginx 规则

rug*_*ert 4 php wordpress nginx url-rewriting vvv-wordpress

我正在使用 Composer 构建自动 WordPress 部署,并将 wp-content 文件夹保留在主 WP 安装之外(因为我有一些自定义插件和主题),该文件夹是从 github 中提取的。

从 github 拉取并运行 Composer 后,我的文件夹结构如下所示:

-composer.php
-env.php
-public/
 |-index.php
 |-wp-config.php
 |-wp-content/
   |-themes/
   |-plugins/
   |-sunrise.php
 |-wp/
   |wordpress stuff
Run Code Online (Sandbox Code Playgroud)

我的 htaccess 规则在使用 MAMP 时运行良好,但我使用 VVV 作为我的开发环境,而 VVV 使用 nginx,因此我的重写规则不起作用。

VVV 使用 2 个conf 文件:一个文件由虚拟机上的所有站点共享(通用规则),另一个文件用于每个站点(基本上仅列出根目录)。

这是我的站点特定的conf文件:

server {
    listen       80;

    listen       443 ssl;

    server_name  auto.dev ~^auto\.\d+\.\d+\.\d+\.\d+\.xip\.io$;
    root         /srv/www/auto/htdocs/wordpress;

    # my rules    
    # tells nginx to prepend "wp" to things
    rewrite ^/(wp-.*.php)$ /wp/$1 last;
    rewrite ^/(wp-(content|admin|includes).*) /wp/$1 last;
    # end WP dir rules 

    include /etc/nginx/nginx-wp-common.conf;

}
Run Code Online (Sandbox Code Playgroud)

所以我添加了

rewrite ^/(wp-.*.php)$ /wp/$1 last;
rewrite ^/(wp-(content|admin|includes).*) /wp/$1 last;
Run Code Online (Sandbox Code Playgroud)

这种方法可行(我能够获取管理区域,并且管理区域拥有所有 CSS 和 JS),但我面临 3 个大问题:

1)网站的前端不再有CSS。Chrome 的控制台在我的 index.php 的第二行显示错误:

Uncaught SyntaxError: Unexpected token <
Run Code Online (Sandbox Code Playgroud)

注意 - 看起来有些主题有效,具有“二十十五”主题的网站看起来有效。

2)我无法访问多站点网络区域,无论出于何种原因,每当我尝试访问时,http://auto.dev/wp-admin/network/我的请求都会被重写为:http://http//auto.dev/wp-admin/network/因此显然不起作用

3)最后我无法登录我的子网站。像这样的东西http://auto.dev/wiki/wp-admin/给了我一个重定向循环

4)我刚刚注意到,当我尝试更改网站的主题时,主题预览被破坏。

bir*_*ire 5

只是一些注意事项:

您的wp-content/文件夹不在wp/您此处所述的文件夹下:

rewrite ^/(wp-(content|admin|includes).*) /wp/$1 last;
Run Code Online (Sandbox Code Playgroud)

由于默认主题(例如“二十十五” )随文件夹一起提供/wp/wp-content/,因此它可以解释为什么您要让它在那里工作。

关于/wp/网络管理 URL 中缺失的部分,Daniel Bachhuber发布了这个方便的要点片段来解决该问题。它使用network_site_url过滤器来注入它。

<?php
/**
 * Fix network admin URL to include the "/wp/" base
 * 
 * @see https://core.trac.wordpress.org/ticket/23221
 */
add_filter( 'network_site_url', function( $url, $path, $scheme ){
    $urls_to_fix = array(
        '/wp-admin/network/',
        '/wp-login.php',
        '/wp-activate.php',
        '/wp-signup.php',
        );
    foreach( $urls_to_fix as $maybe_fix_url ) {
        $fixed_wp_url = '/wp' . $maybe_fix_url;
        if ( false !== stripos( $url, $maybe_fix_url )
            && false === stripos( $url, $fixed_wp_url ) ) {
            $url = str_replace( $maybe_fix_url, $fixed_wp_url, $url );
        }
    }
    return $url;
}, 10, 3 );
Run Code Online (Sandbox Code Playgroud)

另请参阅具有根站点地址的子目录中多站点上的开放票证#23221

GitHub 上有一些关于 nginx + 具有 wp 骨架结构的多站点的讨论(我前段时间在那里发布了一些实验)。