所有域

时间:2015-06-25 06:14:46

标签: php wordpress ubuntu

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

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

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

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

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

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

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

Single CMS installation

的WordPress

要弄清楚哪种方法最有效,我可以提出这两种不同的方案:

  1. 其中只有一个符号链接文件夹,此文件夹包含wordpress核心文件。
  2. 所有wordpress核心文件和文件夹都是符号链接。
  3. 在这两个场景中,设置都试图要求他们自己的配置文件(my-config.php),所以不是符号链接的那个。

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

      

    的wordpress / WP-config.php中

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

    的wordpress / test.php的

    <?php echo 'Path is '.getcwd(); ?>
    
      

    的DocumentRoot / index.php的

    <?php
    define('ROOT_PATH', dirname(__FILE__) . '/');
    require('wordpress/index.php');
    
      

    的DocumentRoot /我的-config.php中

    包含除wordpress/wp-config.php

    内的代码之外的所有内容
    <?php
    define('WP_HOME', ... );
    define( 'WP_CONTENT_URL', ... );
    etc..
    
      

    符号链接如下

    ln -s /path/to/wordpress/ .
    
      

    我的结果

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

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

      

    的wordpress / WP-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');
    
      

    的wordpress / test.php的

    <?php echo 'Path is '.getcwd(); ?>
    
      

    的DocumentRoot /我的-config.php中

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

      

    符号链接如下

    ln -s /path/to/wordpress/* .
    
      

    我的结果

    • [访问过的网址] - [测试结果]
    • ../ - 重定向到:../ 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访问。

3 个答案:

答案 0 :(得分:5)

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

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

所以你要做的就是将索引文件指向它移动时指向的代码。对于任何文件所在的Web服务器来说无关紧要,因为它不会将任何内容路由到它们只有索引。只要正在使用的系统用户可以访问文件,PHP就可以访问这些文件。

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

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

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

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

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

<强>更新

我建议做的是在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';
 }

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

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

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

答案 1 :(得分:0)

最后!

我找到了一种方法,可以使用一组WordPress核心文件在不使用WP Multisite或核心文件的任何重大更改的情况下运行多个网站。

此示例基于以下结构:

var/
|
├── core/ # chown -R www-data:www-data .
|   |     # find . -type d -exec chmod 755 {} \;
|   |     # find . -type f -exec chmod 644 {} \;
|   ├── wp-admin/
|   ├── wp-content/
|   |   ├── themes/
|   |   ├── plugins/
|   |   └── languages/
|   ├── wp-includes/
|   └── wp-config.php
|   └── # all other wordpress core files...
|
├── sites/ # chown -R www-data:www-data .
|   |      # find . -type d -exec chmod 775 {} \;
|   |      # find . -type f -exec chmod 664 {} \;
|   ├── alpha/
|   |   ├── wp-admin -> /var/core/wp-admin/
|   |   |   # ln -s /var/core/wp-admin /var/sites/alpha/
|   |   ├── wp-includes -> /var/core/wp-includes/
|   |   |   # ln -s /var/core/wp-includes /var/sites/alpha/
|   |   ├── wp-content/
|   |   |   └── . # files only available for alpha
|   |   ├── wp-login.php -> /var/core/wp-login.php
|   |   |   # ln -s /var/core/wp-admin /var/sites/alpha/    
|   |   └── index.php
|   └── beta/
|   |   ├── wp-admin -> /var/core/wp-admin/
|   |   |   # ln -s /var/core/wp-admin /var/sites/beta/
|   |   ├── wp-includes -> /var/core/wp-includes/
|   |   |   # ln -s /var/core/wp-includes /var/sites/beta/
|   |   ├── wp-content/
|   |   |   └── . # files only available for beta
|   |   ├── wp-login.php -> /var/core/wp-login.php
|   |   |   # ln -s /var/core/wp-admin /var/sites/beta/ 
|   |   └── index.php
|   └── . # etc...
.

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

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

保留所有其他核心文件,您可能希望在此核心目录的wp-content中添加一些插件或主题,以使它们全局可用于所有站点/实例。

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

<?php
/* -------------------------------------------- *
**  MySQL settings.                            **
* -------------------------------------------- */
define('DB_NAME', 'wp_multipress');
define('DB_USER', 'manager');
define('DB_PASSWORD', 'mylittlepony');
define('DB_HOST', 'localhost');
define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');
$table_prefix = 'alpha_';


/* -------------------------------------------- *
**  Authentication Unique Keys and Salts.      **
* -------------------------------------------- */
// Generate a set of keys:
// https://api.wordpress.org/secret-key/1.1/salt/


/* -------------------------------------------- *
**  Dynamically determine the WP root URL.     **
* -------------------------------------------- */
$path = trim(substr((strpos(dirname(__FILE__),'wp-admin')===false)?dirname(__FILE__):strstr(dirname(__FILE__),'/wp-admin'), strlen(rtrim($_SERVER['DOCUMENT_ROOT'],'/'))), '/');
$domain = !empty($_SERVER['HTTP_HOST'])?$_SERVER['HTTP_HOST']:$_SERVER['SERVER_NAME']; $force_domain = $domain;
$http = 'http'.(isset($_SERVER['HTTPS'])&&$_SERVER['HTTPS']!='off'?'s':'').'://'; $force_http = $http;

// Uncomment the line below to force to https
//$force_http = strpos($http,'https')===false?'https://':$http;

// Uncomment the line below to force to www.
//$force_domain = strpos($domain,'www.')===false?'www.'.$domain:$domain;

// Or uncomment the line below to prevent access to www.
//$force_domain = strpos($domain,'www.')!==false?substr($domain,strpos($domain,'www.')):$domain;

$url = $force_http.$force_domain.(!empty($path)?'/'.$path:'');
if ($force_http!==$http||$force_domain!==$domain){ header('Location: '.$url.$_SERVER['REQUEST_URI']);exit(); }


 /* -------------------------------------------- *
 **  General settings.                          **
 * -------------------------------------------- */
define('WP_HOME', $url);
define('WP_SITEURL', $url);
define('WP_TEMP_DIR', sys_get_temp_dir());


/* -------------------------------------------- *
**  File System settings.                      **
* -------------------------------------------- */
define('FS_METHOD', 'direct');
define('WP_CONTENT_DIR', dirname(__FILE__).'/wp-content');


/* -------------------------------------------- *
**  Debug settings.                            **
* -------------------------------------------- */
define('WP_DEBUG', false);
define('WP_DEBUG_LOG', false);
define('WP_DEBUG_DISPLAY', false);
define('SCRIPT_DEBUG', false);
define('SAVEQUERIES', false);


/* -------------------------------------------- *
**  Cache settings.                            **
* -------------------------------------------- */
define('COMPRESS_CSS', true);
define('COMPRESS_SCRIPTS', true);
define('CONCATENATE_SCRIPTS', true);
define('ENFORCE_GZIP', true);


/* -------------------------------------------- *
**  WordPress Localized Language.              **
* -------------------------------------------- */
define('WPLANG', '');


/* -------------------------------------------- *
**  That's all, stop editing! Happy blogging.  **
* -------------------------------------------- */
if ( !defined('ABSPATH') )
    define('ABSPATH', dirname(__FILE__) . '/');
require_once(ABSPATH . 'wp-settings.php');

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

<?php
/**
 * Front to the WordPress application. This file doesn't do anything, but loads
 * wp-blog-header.php which does and tells WordPress to load the theme.
 *
 * @package WordPress
 */

/**
 * Let MultiPress render this website.
 *
 * @var string
 */
define('MULTIPRESS_ABSPATH', dirname( __FILE__ ) . '/');

/**
 * Tells WordPress to load the WordPress theme and output it.
 *
 * @var bool
 */
define('WP_USE_THEMES', true);

/** Loads the WordPress Environment and Template from MultiPress */
require( '/var/core/wp-blog-header.php' );

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

应该这样做!

答案 2 :(得分:-1)