Лучшая практика для управления версиями wp-config.php?


35

Есть ли лучшая практика для включения вашего wp-config.phpфайла в ваш репозиторий контроля версий?

Я подумываю о создании нового сайта с такой конфигурацией (по аналогии с Алексом Кингом и Марком Джакитом ):

/index.php
/local-config.php
/wp-config.php
/wp/ (core)
/wp-content/ (plugins, themes, etc.)

Как я могу сделать это, не выставляя свои пароли на git, если этот репозиторий когда-нибудь станет публичным?

Особенно в посте Марка, похоже, что local-config.php может хранить детали и пароли локальной базы данных, но рабочие остаются в wp-config.php. Это слишком много проблем, и я должен просто оставить wp-config.php без версии?


Я думаю, то, как Марк Джакит делает это, не доставляет особых хлопот, работает нормально и немного лучше, чем ответ ниже.
Wyck

ИМО, все должно быть поставлено под контроль версий, и система должна иметь возможность обрабатывать различные среды без каких-либо хакерских действий, а также обеспечивать безопасность и простоту работы. Я только что написал о том, как я это делаю, который охватывает все ваши проблемы :) Дайте мне знать, если у вас есть какие-либо вопросы о моей настройке.
Ashfame

Ответы:


45

Вот как я это делаю, и я не встречал ничего лучше этого. Я держу другую версию файла wp-config.php под контролем версий, а затем держу файл на один каталог выше, который содержит все учетные данные базы данных и соли / ключи. Кроме того, таким образом, я могу различать тип установки, которую я использую, и по-другому это делать.

Вот то, что wp-config.phpя держу под git( https://gist.github.com/1923821 ):

<?php

/**
* Define type of server
*
* Depending on the type other stuff can be configured
* Note: Define them all, don't skip one if other is already defined
*/

define( 'DB_CREDENTIALS_PATH', dirname( ABSPATH ) ); // cache it for multiple use
define( 'WP_LOCAL_SERVER', file_exists( DB_CREDENTIALS_PATH . '/local-config.php' ) );
define( 'WP_DEV_SERVER', file_exists( DB_CREDENTIALS_PATH . '/dev-config.php' ) );
define( 'WP_STAGING_SERVER', file_exists( DB_CREDENTIALS_PATH . '/staging-config.php' ) );

/**
* Load DB credentials
*/

if ( WP_LOCAL_SERVER )
    require DB_CREDENTIALS_PATH . '/local-config.php';
elseif ( WP_DEV_SERVER )
    require DB_CREDENTIALS_PATH . '/dev-config.php';
elseif ( WP_STAGING_SERVER )
    require DB_CREDENTIALS_PATH . '/staging-config.php';
else
    require DB_CREDENTIALS_PATH . '/production-config.php';

/**
* Authentication Unique Keys and Salts.
*
* Change these to different unique phrases!
* You can generate these using the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}
* You can change these at any point in time to invalidate all existing cookies. This will force all users to have to log in again.
*/

if ( ! defined( 'AUTH_KEY' ) )
    define('AUTH_KEY', '9*W=5&lt;Rw-)c].9}g?^[:!j]h+Efr&lt;y$&lt;YmV0XOo|lOIujEE}+[R}iAQZ :Sy3wN}');
if ( ! defined( 'SECURE_AUTH_KEY' ) )
    define('SECURE_AUTH_KEY', 'APge3~H;g+b0FyNF&amp;e`$=g?qj9@FQwqFe^Q4(@p#kDa=NR? $Z9|@v*a(tOj*B+.');
if ( ! defined( 'LOGGED_IN_KEY' ) )
    define('LOGGED_IN_KEY', '5l0+:WTpj8#[V|;&lt;Iw;%rkB(A}r++HwT|s[LW!.wt.=5J!b%Z{F1/[LxQ*d7J&gt;Cm');
if ( ! defined( 'NONCE_KEY' ) )
    define('NONCE_KEY', 'zO2cmQX`Kc~_XltJR&amp;T !Uc72=5Cc6`SxQ3;$f]#J)p&lt;/wwX&amp;7RTB2)K1Qn2Y*c0');
if ( ! defined( 'AUTH_SALT' ) )
    define('AUTH_SALT', 'je]#Yh=RN DCrP9/N=IX^,TWqvNsCZJ4f7@3,|@L]at .-,yc^-^+?0ZfcHjD,WV');
if ( ! defined( 'SECURE_AUTH_SALT' ) )
    define('SECURE_AUTH_SALT', '^`6z+F!|+$BmIp&gt;y}Kr7]0]Xb@&gt;2sGc&gt;Mk6,$5FycK;u.KU[Tw$345K9qoF}WV,-');
if ( ! defined( 'LOGGED_IN_SALT' ) )
    define('LOGGED_IN_SALT', 'a|+yZsR-k&lt;cSf@PQ~v82a_+{+hRCnL&amp;|aF|Z~yU&amp;V0IZ}Mrz@ND])YD22iUM[%Oc');
if ( ! defined( 'NONCE_SALT' ) )
    define('NONCE_SALT', '|1.e9Tx{fPv8D#IXO6[&lt;WY*,)+7+URp0~|:]uqiCOzu93b8,h4;iak+eIN7klkrW');

/**
* WordPress Database Table prefix.
*
* You can have multiple installations in one database if you give each a unique
* prefix. Only numbers, letters, and underscores please!
*/

$table_prefix = 'ft_';

/**
* WordPress Localized Language, defaults to English.
*
* Change this to localize WordPress. A corresponding MO file for the chosen
* language must be installed to wp-content/languages. For example, install
* de_DE.mo to wp-content/languages and set WPLANG to 'de_DE' to enable German
* language support.
*/

define( 'WPLANG', '' );

/**
* For developers: WordPress debugging mode.
*
* Change this to true to enable the display of notices during development.
* It is strongly recommended that plugin and theme developers use WP_DEBUG
* in their development environments.
*/

if ( WP_LOCAL_SERVER || WP_DEV_SERVER ) {

    define( 'WP_DEBUG', true );
    define( 'WP_DEBUG_LOG', true ); // Stored in wp-content/debug.log
    define( 'WP_DEBUG_DISPLAY', true );

    define( 'SCRIPT_DEBUG', true );
    define( 'SAVEQUERIES', true );

} else if ( WP_STAGING_SERVER ) {

    define( 'WP_DEBUG', true );
    define( 'WP_DEBUG_LOG', true ); // Stored in wp-content/debug.log
    define( 'WP_DEBUG_DISPLAY', false );

} else {

    define( 'WP_DEBUG', false );
}


/* That's all, stop editing! Happy blogging. */

/** Absolute path to the WordPress directory. */
if ( !defined('ABSPATH') )
define('ABSPATH', dirname(__FILE__) . '/');

/** Sets up WordPress vars and included files. */
require_once(ABSPATH . 'wp-settings.php');

А вот локальный файл конфигурации, который я храню на один каталог выше корневого каталога WordPress, и это также делает его вне каталога, доступного через Интернет, поэтому в случае, если apache прекратит парсинг PHP-файлов и начнет их выбрасывать, наши учетные данные базы данных по-прежнему будут в безопасности ( https: / /gist.github.com/1923848 ):

<?php

/**
 * WordPress config file to use one directory above WordPress root, when awesome version of wp-config.php is in use.
 *
 * Awesome wp-config.php file - https://gist.github.com/1923821
 */

/* WordPress Local Environment DB credentials */

define('DB_NAME', 'project_21');
define('DB_USER', 'root');
define('DB_PASSWORD', 'root');
define('DB_HOST', 'localhost');
define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');

/* Keys & Salts */

define('AUTH_KEY',         '5H%)s-nQ,+fn0gwg/p1UjBTmCQ?l[8-!>Q{MW&?X3DM,OF;TaI<SOOTrl0+-@) *');
define('SECURE_AUTH_KEY',  '+%rr@,XIt-V+[.B9++uH1L,L+r)uq}5(:~=&4~Lk|.LV|y;R}fEo?G}+Sntf_JN}');
define('LOGGED_IN_KEY',    'Szv!gQm9#(L&TUD OnM`>sXGge:m1j`L2 5sO;hRNVhlN>IUED1/`%<[ly-GxVJ ');
define('NONCE_KEY',        'o-Jo;>G#-%~,[ki@REqXV%4^I.HDnc.3]P;e8];4pJt% $xe5K<aOb|a2*QKV4c-');
define('AUTH_SALT',        '8-tQb3d|W8,;Y_#mfuFB.1&b%U2fnlLD|F&yH).tLRX=ANEdNap{78o|9tqv6JPt');
define('SECURE_AUTH_SALT', 'RSa%^qd~T|@+!-;qgh,qK-GJ}zPpgxz#+@v6-I;BMwqT`TzGTtg_^n*ILxGOdbq4');
define('LOGGED_IN_SALT',   ']+XV)YK.Q-EU1vR [BT!Y$!d(J_[AO37OP[Fg[/esFx;6cI-L[^O|cvtw9F[;_*Q');
define('NONCE_SALT',       'iP{nTQBzy&f^hSbwBgyan.v9<+ErvAMi2ymLhz`Tl-fF?HXa(j<W`wA*8U3R#-|w');

Таким образом, если указанный выше файл назван local-config.php, моя система ведет себя как локальная установка. Если его имя staging-config.php, оно ведет себя как инсталляционная установка и если его имя production-config.php. Это помогает мне иметь разные значения определенных констант, например, отладка имеет разные значения в разных средах и все еще в SCM (git). Возможности бесконечны, и нет необходимости в хакерстве для различных сред.

Это гарантирует, что вы никогда не будете раскрывать какую-либо конфиденциальную информацию публично, и я использую это просто для запуска любого проекта, над которым я работаю, по умолчанию у меня есть более надежные ключи, и как только я добавляю их во второй файл конфигурации на одну папку выше, те используются вместо определенных здесь. Блаженство!


Мне нравится этот подход, я, вероятно, в конечном итоге сделаю что-то подобное.
Джитон

Как вы ссылаетесь на каталог local-config-file-in-the-parent-из основного файла конфигурации? Через символическую ссылку или через ../(то есть ../filename) где-то? - Я не нашел ничего ../в основном wp-config.phpфайле.
КайМагнус

1
@KajMagnus константа DB_CREDENTIALS_PATHделает это.
Ashfame

9

Как я могу сделать это, не выставляя свои пароли на git, если этот репозиторий когда-нибудь станет публичным?

Если ваш wp-config.phpфайл находится в режиме управления версиями, то все содержащиеся в нем пароли также будут находиться в режиме управления версиями. Единственный способ избежать этого - не помещать файл в систему контроля версий.

Это слишком много проблем, и я должен просто оставить wp-config.php без версии?

Моим внутренним чувством было бы wp-config.phpполное сохранение неосторожности. Но есть несколько способов обойти это.

Извлеките часть wp-config.php, содержащую ваши пароли и хэши, в отдельный файл и include()в обычный wp-config.phpфайл. Затем поместите wp-config.phpпод контроль версий, но держите ваш include()файл отдельно.

wp-config.php:

<?php
/**
 * The base configurations of the WordPress.
 *
 * This file has the following configurations: MySQL settings, Table Prefix,
 * Secret Keys, WordPress Language, and ABSPATH. You can find more information
 * by visiting {@link http://codex.wordpress.org/Editing_wp-config.php Editing
 * wp-config.php} Codex page. You can get the MySQL settings from your web host.
 *
 * This file is used by the wp-config.php creation script during the
 * installation. You don't have to use the web site, you can just copy this file
 * to "wp-config.php" and fill in the values.
 *
 * @package WordPress
 */

/** Database Charset to use in creating database tables. */
define('DB_CHARSET', 'utf8');

/** The Database Collate type. Don't change this if in doubt. */
define('DB_COLLATE', '');

include( 'conf.php' );    

/**#@-*/

/**
 * WordPress Database Table prefix.
 *
 * You can have multiple installations in one database if you give each a unique
 * prefix. Only numbers, letters, and underscores please!
 */
$table_prefix  = 'wp_';

/**
 * WordPress Localized Language, defaults to English.
 *
 * Change this to localize WordPress. A corresponding MO file for the chosen
 * language must be installed to wp-content/languages. For example, install
 * de_DE.mo to wp-content/languages and set WPLANG to 'de_DE' to enable German
 * language support.
 */
define('WPLANG', '');

/**
 * For developers: WordPress debugging mode.
 *
 * Change this to true to enable the display of notices during development.
 * It is strongly recommended that plugin and theme developers use WP_DEBUG
 * in their development environments.
 */
define('WP_DEBUG', false);

/* That's all, stop editing! Happy blogging. */

/** Absolute path to the WordPress directory. */
if ( !defined('ABSPATH') )
    define('ABSPATH', dirname(__FILE__) . '/');

/** Sets up WordPress vars and included files. */
require_once(ABSPATH . 'wp-settings.php');

Теперь вы можете видеть, что пароли и хэши вообще не включены wp-config.php.

conf.php:

// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define('DB_NAME', 'database_name_here');

/** MySQL database username */
define('DB_USER', 'username_here');

/** MySQL database password */
define('DB_PASSWORD', 'password_here');

/** MySQL hostname */
define('DB_HOST', 'localhost');


/**#@+
 * Authentication Unique Keys and Salts.
 *
 * Change these to different unique phrases!
 * You can generate these using the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}
 * You can change these at any point in time to invalidate all existing cookies. This will force all users to have to log in again.
 *
 * @since 2.6.0
 */
define('AUTH_KEY',         'put your unique phrase here');
define('SECURE_AUTH_KEY',  'put your unique phrase here');
define('LOGGED_IN_KEY',    'put your unique phrase here');
define('NONCE_KEY',        'put your unique phrase here');
define('AUTH_SALT',        'put your unique phrase here');
define('SECURE_AUTH_SALT', 'put your unique phrase here');
define('LOGGED_IN_SALT',   'put your unique phrase here');
define('NONCE_SALT',       'put your unique phrase here');

Но, честно говоря, на данный момент вы просто добавляете избыточный уровень абстракции здесь. Во wp-config.php-первых, вся причина в том, что она зависит от окружающей среды. Вы вообще не должны копировать его с локального сервера в рабочий ... поэтому он вообще не должен находиться под контролем версий.


Это кажется дополнительной работой, но я вижу преимущества в том, что все настройки wp-config синхронизированы между средами.
Джитон

Разделение wp-config.phpимеет дополнительное преимущество: вы можете включить conf.phpв сценарий не WP без загрузки всего WordPress.
Тамлин

4

Пример Марка предполагает, что вы работаете с частным репо:

if ( file_exists( dirname( __FILE__ ) . '/local-config.php' ) ) {
  include( dirname( __FILE__ ) . '/local-config.php' );
  define( 'WP_LOCAL_DEV', true ); 
} else {
  define( 'DB_NAME',     'production_db'       );
  define( 'DB_USER',     'production_user'     );
  define( 'DB_PASSWORD', 'production_password' );
  define( 'DB_HOST',     'production_db_host'  );
}

Вместо определения учетных данных вы также можете легко создать файл production-config.php и включить его в условную проверку:

if ( file_exists( dirname( __FILE__ ) . '/local-config.php' ) ) {
      include( dirname( __FILE__ ) . '/local-config.php' );
      define( 'WP_LOCAL_DEV', true ); 
    } else {
     include( dirname( __FILE__ ) . '/production-config.php' )
    }

Затем в вашем неверсионном файле production-config.php:

  define( 'DB_NAME',     'production_db'       );
  define( 'DB_USER',     'production_user'     );
  define( 'DB_PASSWORD', 'production_password' );
  define( 'DB_HOST',     'production_db_host'  );

Даже если это частное репо, я бы не хотел, чтобы в нем хранились пароли, и хотел бы, чтобы при желании можно было сделать его публичным. Production-config.php - это, вероятно, хороший путь.
Джитон

2

Вы можете зафиксировать wp-config.phpфайл в хранилище без ваших секретных строк, а затем запустить:

git update-index --assume-unchanged wp-config.php

Это скажет git предположить, что файл, в общем-то, не изменился.


4
Полезно знать, я не знал о assume-unchangedпереключателе, но вот два моих замечания: (1) Если вы добавите файл напрямую, он будет добавлен в индекс. Таким образом, существует риск, что вы можете случайно добавить его в какой-то момент. (2) Слияние коммита с этим флажком приведет к изящному сбою слияния, так что вы можете обработать его вручную, что делает его не элегантным решением. Он может использоваться только для временного игнорирования изменений во время чего-то вроде сеанса разработки. Здесь читайте больше - gitready.com/intermediate/2009/02/18/…
Ashfame
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.