Краща практика для версії 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 без перегляду?


Я думаю, те, що Марк Джакіт робить це, не викликає особливих проблем і працює чудово, і трохи краще, ніж відповідь нижче.
Вік

IMO, все повинно бути поставлено під досконалий контроль, і система повинна мати можливість обробляти різні середовища без будь-яких хакерських речей, а також зберігати речі в безпеці та простоті роботи. Я щойно розмістив повідомлення про те, як я це роблю, що охоплює всі ваші занепокоєння :) Повідомте мене, чи є у вас питання щодо моєї настройки.
Ашфема

Відповіді:


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, і це також робить його за межами веб-доступного каталогу, тому у випадку, якщо апаш перестане розбирати файли 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). Можливості є нескінченними, і для різних поводжень не потрібне хакерство.

Це гарантує, що ви ніколи не відкриватимете публічній інформації будь-яку конфіденційну інформацію, і я використовую це лише для запуску будь-якого проекту, над яким я працюю. У мене є більш міцні клавіші за замовчуванням, і як тільки я додаю їх до другого файлу конфігурації, в одному каталозі, використовуються замість визначених тут. Блаженство!


Мені подобається такий підхід, я, мабуть, закінчусь робити щось подібне.
jjeaton

Як ви посилаєтесь на каталог-local-config-file-in-the-parent-файл з головного файлу config? Через символічне посилання або через ../(тобто ../filename) десь? - Я не знайшов жодного ../в головному wp-config.phpфайлі.
KajMagnus

1
@KajMagnus Константа DB_CREDENTIALS_PATHробить це.
Ашфема

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 між середовищами.
jjeaton

Розщеплення 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' )
    }

Потім у вашому неперевершеному виробництві-config.php:

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

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

2

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

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

Це дозволить git припустити, що файл є, ну, незмінним.


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