CMS文档根目录外的CMS安装可用于所有域

Fle*_*euv 11 php wordpress ubuntu

如何配置像WordPress或Drupal这样的CMS安装,以在多个网站上运行,作为一个主CMS安装的复制.由托管在同一服务器上的不同服务器帐户拥有和管理.

我的设置类似于以下内容:

  • Web 服务器软件:nginxapache2(VestaCP)一起运行
  • 文件根: /home/user/example.com/public_html/

我的意思是"一个CMS安装的复制品":

如图所示,拥有指向DocumentRoot的文件夹的所有用户将能够复制/创建/使用CMS安装的实例.

您可能需要以下文件才能运行CMS安装:

  • DocumentRoot/configuration.php - 指定CMS应加载哪些数据.
  • DocumentRoot/index.php - 调用并呈现指定的输出.

单个CMS安装


WordPress的

为了找出最好的方法,我可以提出这两种不同的方案:

  1. 只有一个符号链接文件夹,此文件夹包含wordpress核心文件.
  2. 所有wordpress核心文件和文件夹都是符号链接的.

在这两个场景中,设置都试图要求他们自己的配置文件(my-config.php),所以不是符号链接的那个.

1:符号链接的wordpress文件夹:

的wordpress /可湿性粉剂的config.php

<?php
require_once( ROOT_PATH . 'my-config.php');
if ( !defined('ABSPATH') )
    define('ABSPATH', dirname(__FILE__) . '/');

require_once(ABSPATH . 'wp-settings.php');
Run Code Online (Sandbox Code Playgroud)

WordPress的/ test.php的

<?php echo 'Path is '.getcwd(); ?>
Run Code Online (Sandbox Code Playgroud)

的DocumentRoot/index.php文件

<?php
define('ROOT_PATH', dirname(__FILE__) . '/');
require('wordpress/index.php');
Run Code Online (Sandbox Code Playgroud)

DocumentRoot的/我-config.php文件

包含除里面代码之外的所有内容 wordpress/wp-config.php

<?php
define('WP_HOME', ... );
define( 'WP_CONTENT_URL', ... );
etc..
Run Code Online (Sandbox Code Playgroud)

符号链接如下

ln -s /path/to/wordpress/ .
Run Code Online (Sandbox Code Playgroud)

我的结果

  • [访问过的网址] - [测试结果]
  • ../ - 重定向到:../ wp-admin/install.php + 404
  • ../wp-admin/ - 404
  • ../wordpress/ - WSOD
  • ../wordpress/wp-admin/ - WSOD
  • ../wordpress/test.php - 输出:路径是/ path/to/wordpress

2:另一种方法可能是这样的:

的wordpress /可湿性粉剂的config.php

<?php
require_once('my-config.php'); // So DocumentRoot/my-config.php
if ( !defined('ABSPATH') )
    define('ABSPATH', dirname(__FILE__) . '/');

require_once(ABSPATH . 'wp-settings.php');
Run Code Online (Sandbox Code Playgroud)

WordPress的/ test.php的

<?php echo 'Path is '.getcwd(); ?>
Run Code Online (Sandbox Code Playgroud)

DocumentRoot的/我-config.php文件

与方案1中使用的DocumentRoot配置文件相同.

符号链接如下

ln -s /path/to/wordpress/* .
Run Code Online (Sandbox Code Playgroud)

我的结果

  • [访问过的网址] - [测试结果]
  • ../ - 重定向到:../ wp-admin/install.php + WSOD
  • ../wp-admin/ - WSOD
  • ../test.php - 输出:路径为/home/user/example.com/public_html

结论WordPress

在这两个方案中,主索引文件都重定向到安装文件.这通常发生在与数据库建立连接但数据库仍为空时,因此按照安装说明插入第一个数据.但那为什么它会给WSOD呢?

测试文件(test.php)清除了一些东西.在场景1中,wordpress目录的路径成为wordpress核心文件的绝对路径.对于场景2,DocumentRoot的路径成为wordpress核心文件的绝对路径......或不?

虽然不是wordpress目录中的子目录,但我们可以从方案1中学习.例如wp-admin目录,文件getcwd()应该输出什么样的/path/to/wordpress/wp-admin权利?如果是这样则意味着,对这些目录中的文件的所有调用都将永远不会找到该文件.因为该文件/home/user/example.com/public_html/wp-admin/file.php不存在!它没有象征性的联系,因此它只能通过/path/to/wordpress/wp-admin/file.php.

Art*_*nix 5

实际上这很容易,关键当然是你的索引文件.MVC框架,我只是非常松散地将wordpress投入到该类别中,所有这些都有一个切入点.显然,大多数这些的入口点是索引文件.

实际上,它所要求的唯一文件是索引文件,它实际上是唯一被调用的代码.运行的其余内容将被路由,因为索引文件与知道如何执行此操作的代码硬链接.

因此,您所要做的就是将索引文件指回到移动它时指向的代码.对于任何文件都是网络服务器并不重要,因为它不会向索引路由任何内容.只要正在使用的系统用户可以访问文件,PHP就可以访问这些文件.

为每个配置文件分别配置文件可能更困难,例如,如果要使用单独的数据库.大多数CMS或MVC框架都不允许您告诉他们配置文件的位置,它只是在某个任意位置.你将在wordpress中遇到的问题是,在常规设置中你有网站网址和wordpress网址.不幸的是,这些在数据库中,这使得更改它们变得更加困难.此外,您可能不希望每个站点具有完全相同的菜单.

所以真正使用wordpress示例,您必须将配置文件包含在其他地方,方法是将它们组合到实际的配置文件中Load it when WordPress wants it to load:.我认为你的示例配置文件是在正确的轨道上,但你必须使用单独的数据库,因为网站url和wordpress url ..

这个事实实际上使维护变得更加困难,因为wordpress在升级到核心时不一定会更新正确的数据库.

网站网址必须是实际的域名.wordpress url是访问管理脚本的地方.所以也有一部分要解决,wp-admin.

无论如何祝你好运,并确保在Wordpress管理区域的常规选项卡中更改这些设置.

UPDATE

我建议做的是从orignal配置文件中创建一个非常简单的路由器,它不一定是花哨的.您可以使用$_SERVER[HTTP_HOST]正在执行请求的域来基于每个请求进行分析.有了这些信息,你可以做一些简单的事情(PSUDO CODE)

 switch( $_SERVER['HTTP_HOST' ){
       case 'domain1':
            require 'location of domain1 config';
       break;
       case 'domain2':
            require 'location of domain2 config';
       break;
       default:
            require 'master site config';
 }
Run Code Online (Sandbox Code Playgroud)

然后在每个站点的相应文件夹中放置site_url,数据库的配置文件,以及普通wp-config中的内容.排泄物,那么只需要确定是否要为该站点的每个实例提供对管理区域的访问权限.

这(仅更改原始配置而不是wp-load.php)可能更容易维护,因为稍后查找每个配置文件相对微不足道,并且您对wordpress核心代码的影响尽可能小.虽然wp-load会有所改变,但是它是一个自然的地方,可以为每个站点寻找自定义内容.

我对管理区域的关注是你必须通过wp-admin.php而不是索引页面来运行它.我不是那个熟悉的WordPress架构,它与加载管理区域的确定性有关,但可能需要进行一些调整.


Fle*_*euv 0

最后!

\n\n

我找到了一种方法,可以使用一组 WordPress 核心文件来运行多个网站,而无需使用 WP Multisite 或对核心文件进行任何重大更改。

\n\n

该示例基于以下结构:

\n\n
var/\n|\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 core/ # chown -R www-data:www-data .\n|   |     # find . -type d -exec chmod 755 {} \\;\n|   |     # find . -type f -exec chmod 644 {} \\;\n|   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 wp-admin/\n|   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 wp-content/\n|   |   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 themes/\n|   |   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 plugins/\n|   |   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 languages/\n|   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 wp-includes/\n|   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 wp-config.php\n|   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 # all other wordpress core files...\n|\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 sites/ # chown -R www-data:www-data .\n|   |      # find . -type d -exec chmod 775 {} \\;\n|   |      # find . -type f -exec chmod 664 {} \\;\n|   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 alpha/\n|   |   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 wp-admin -> /var/core/wp-admin/\n|   |   |   # ln -s /var/core/wp-admin /var/sites/alpha/\n|   |   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 wp-includes -> /var/core/wp-includes/\n|   |   |   # ln -s /var/core/wp-includes /var/sites/alpha/\n|   |   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 wp-content/\n|   |   |   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 . # files only available for alpha\n|   |   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 wp-login.php -> /var/core/wp-login.php\n|   |   |   # ln -s /var/core/wp-admin /var/sites/alpha/    \n|   |   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 index.php\n|   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 beta/\n|   |   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 wp-admin -> /var/core/wp-admin/\n|   |   |   # ln -s /var/core/wp-admin /var/sites/beta/\n|   |   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 wp-includes -> /var/core/wp-includes/\n|   |   |   # ln -s /var/core/wp-includes /var/sites/beta/\n|   |   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 wp-content/\n|   |   |   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 . # files only available for beta\n|   |   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 wp-login.php -> /var/core/wp-login.php\n|   |   |   # ln -s /var/core/wp-admin /var/sites/beta/ \n|   |   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 index.php\n|   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 . # etc...\n.\n
Run Code Online (Sandbox Code Playgroud)\n\n

进行/var/core/wp-config.php以下更改:

\n\n
<?php\nif (defined('MULTIPRESS_ABSPATH')) {\n    require_once(MULTIPRESS_ABSPATH . 'wp-config.php');\n} else {\n    $instance_path = $_SERVER['SCRIPT_FILENAME'];\n    if (strpos($instance_path, 'wp-admin') > -1) {\n        $instance_path = dirname(dirname($instance_path)) . '/';\n    } else {\n        $instance_path = dirname($instance_path) . '/';\n    }\n    require_once($instance_path . 'wp-config.php');\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

根据您的意愿保留所有其他核心文件,您可能需要向此核心目录的 wp-content 添加一些插件或主题,以使它们全局可用于所有站点/实例。

\n\n

现在我们可以设置 WP MultiPress 核心的一个实例。下面您可以看到/var/sites/alpha/wp-config.phpalpha 站点的外观。通常,您只需定义唯一键和盐以及您的 MySQL 设置。接下来,您还可以为您的 wp-content 目录配置自定义名称。

\n\n
<?php\n/* -------------------------------------------- *\n**  MySQL settings.                            **\n* -------------------------------------------- */\ndefine('DB_NAME', 'wp_multipress');\ndefine('DB_USER', 'manager');\ndefine('DB_PASSWORD', 'mylittlepony');\ndefine('DB_HOST', 'localhost');\ndefine('DB_CHARSET', 'utf8');\ndefine('DB_COLLATE', '');\n$table_prefix = 'alpha_';\n\n\n/* -------------------------------------------- *\n**  Authentication Unique Keys and Salts.      **\n* -------------------------------------------- */\n// Generate a set of keys:\n// https://api.wordpress.org/secret-key/1.1/salt/\n\n\n/* -------------------------------------------- *\n**  Dynamically determine the WP root URL.     **\n* -------------------------------------------- */\n$path = trim(substr((strpos(dirname(__FILE__),'wp-admin')===false)?dirname(__FILE__):strstr(dirname(__FILE__),'/wp-admin'), strlen(rtrim($_SERVER['DOCUMENT_ROOT'],'/'))), '/');\n$domain = !empty($_SERVER['HTTP_HOST'])?$_SERVER['HTTP_HOST']:$_SERVER['SERVER_NAME']; $force_domain = $domain;\n$http = 'http'.(isset($_SERVER['HTTPS'])&&$_SERVER['HTTPS']!='off'?'s':'').'://'; $force_http = $http;\n\n// Uncomment the line below to force to https\n//$force_http = strpos($http,'https')===false?'https://':$http;\n\n// Uncomment the line below to force to www.\n//$force_domain = strpos($domain,'www.')===false?'www.'.$domain:$domain;\n\n// Or uncomment the line below to prevent access to www.\n//$force_domain = strpos($domain,'www.')!==false?substr($domain,strpos($domain,'www.')):$domain;\n\n$url = $force_http.$force_domain.(!empty($path)?'/'.$path:'');\nif ($force_http!==$http||$force_domain!==$domain){ header('Location: '.$url.$_SERVER['REQUEST_URI']);exit(); }\n\n\n /* -------------------------------------------- *\n **  General settings.                          **\n * -------------------------------------------- */\ndefine('WP_HOME', $url);\ndefine('WP_SITEURL', $url);\ndefine('WP_TEMP_DIR', sys_get_temp_dir());\n\n\n/* -------------------------------------------- *\n**  File System settings.                      **\n* -------------------------------------------- */\ndefine('FS_METHOD', 'direct');\ndefine('WP_CONTENT_DIR', dirname(__FILE__).'/wp-content');\n\n\n/* -------------------------------------------- *\n**  Debug settings.                            **\n* -------------------------------------------- */\ndefine('WP_DEBUG', false);\ndefine('WP_DEBUG_LOG', false);\ndefine('WP_DEBUG_DISPLAY', false);\ndefine('SCRIPT_DEBUG', false);\ndefine('SAVEQUERIES', false);\n\n\n/* -------------------------------------------- *\n**  Cache settings.                            **\n* -------------------------------------------- */\ndefine('COMPRESS_CSS', true);\ndefine('COMPRESS_SCRIPTS', true);\ndefine('CONCATENATE_SCRIPTS', true);\ndefine('ENFORCE_GZIP', true);\n\n\n/* -------------------------------------------- *\n**  WordPress Localized Language.              **\n* -------------------------------------------- */\ndefine('WPLANG', '');\n\n\n/* -------------------------------------------- *\n**  That's all, stop editing! Happy blogging.  **\n* -------------------------------------------- */\nif ( !defined('ABSPATH') )\n    define('ABSPATH', dirname(__FILE__) . '/');\nrequire_once(ABSPATH . 'wp-settings.php');\n
Run Code Online (Sandbox Code Playgroud)\n\n

接下来是实例的索引,看看/var/sites/alpha/index.php下面的内容。

\n\n
<?php\n/**\n * Front to the WordPress application. This file doesn't do anything, but loads\n * wp-blog-header.php which does and tells WordPress to load the theme.\n *\n * @package WordPress\n */\n\n/**\n * Let MultiPress render this website.\n *\n * @var string\n */\ndefine('MULTIPRESS_ABSPATH', dirname( __FILE__ ) . '/');\n\n/**\n * Tells WordPress to load the WordPress theme and output it.\n *\n * @var bool\n */\ndefine('WP_USE_THEMES', true);\n\n/** Loads the WordPress Environment and Template from MultiPress */\nrequire( '/var/core/wp-blog-header.php' );\n
Run Code Online (Sandbox Code Playgroud)\n\n

确保所有文件/var/core/可供运行站点的所有进程读取。另外,不要忘记创建符号链接(如->结构示例中所示)。

\n\n

应该这样做!

\n