Meilleure pratique pour la gestion des versions wp-config.php?

34

Existe-t-il une bonne pratique pour inclure votre fichier wp-config.php dans votre référentiel de contrôle de version?

J'envisage de créer un nouveau site avec ce type de configuration (similaire à Alex King et Mark Jaquith ):

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

Comment puis-je faire cela sans exposer mes mots de passe à git, au cas où ce référentiel deviendrait public?

Surtout dans le message de Mark, il semble que le fichier local-config.php puisse stocker les détails de la base de données locale et les mots de passe, mais ceux de production restent dans le fichier wp-config.php. Est-ce trop de problèmes et devrais-je simplement laisser wp-config.php sans version?

    
posée jjeaton 20.05.2012 - 07:44

4 réponses

43

Voici comment je le fais et je n'ai rien trouvé de mieux que cela. Je garde une version différente du fichier wp-config.php sous contrôle de version, puis je garde un fichier dans le répertoire ci-dessus qui contient toutes les informations d'identification de la base de données et les sels / clés. De plus, je peux faire la distinction entre le type d’installation que j’utilise et faire les choses différemment en fonction de cela.

Voici le wp-config.php que je conserve sous git ( enlace ):

<?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'[email protected]^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^,[email protected],|@L]at .-,yc^-^+?0ZfcHjD,WV');
if ( ! defined( 'SECURE_AUTH_SALT' ) )
    define('SECURE_AUTH_SALT', '^'6z+F!|+$BmIp&gt;y}Kr7]0][email protected]&gt;2sGc&gt;Mk6,$5FycK;u.KU[Tw$345K9qoF}WV,-');
if ( ! defined( 'LOGGED_IN_SALT' ) )
    define('LOGGED_IN_SALT', 'a|+yZsR-k&lt;[email protected]~v82a_+{+hRCnL&amp;|aF|Z~yU&amp;V0IZ}[email protected]])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');

Et voici le fichier de configuration local dans lequel je conserve un répertoire au-dessus de la racine WordPress, ce qui le rend également en dehors du répertoire accessible par le Web. Ainsi, si Apache cesse d’analyser les fichiers PHP et commence à les jeter, nos informations d’identité de base de données sont toujours sûres ( enlace ):

<?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<[email protected]) *');
define('SECURE_AUTH_KEY',  '+%[email protected],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#-%~,[[email protected]%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#[email protected];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');

Ainsi, si le fichier ci-dessus s'appelle local-config.php , mon système se comporte comme une installation locale. Si elle s'appelle staging-config.php , elle se comporte comme une installation intermédiaire et si elle s'appelle production-config.php . Cela m'aide à avoir différentes valeurs de certaines constantes, comme le débogage, différentes valeurs dans différents environnements et toujours sous SCM (git). Les possibilités sont infinies et aucun piratage n'est requis pour différents environnements.

Cela garantit que vous ne divulguez jamais aucune information sensible au public de toute façon et que je l'utilise uniquement pour démarrer tout projet sur lequel je travaille. J'ai des clés plus strongs en place par défaut et dès que je les ajoute au deuxième fichier de configuration, répertoire ci-dessus, ceux-ci sont utilisés à la place de ceux définis ici. Bonheur!

    
réponse donnée Ashfame 23.05.2012 - 11:07
9
  

Comment puis-je faire cela sans exposer mes mots de passe à git, au cas où ce référentiel deviendrait public?

Si votre fichier wp-config.php est sous contrôle de version, tous les mots de passe qu’il contient seront également dans le contrôle de version. Le seul moyen d'éviter cela est de ne pas placer le fichier dans le contrôle de version.

  

Est-ce trop de problèmes et devrais-je simplement laisser wp-config.php sans version?

Mon instinct serait de garder wp-config.php sans version. Mais il existe des moyens de le contourner.

Extrayez la partie de wp-config.php qui contient vos mots de passe et les hachages dans un fichier séparé et include() dans le fichier wp-config.php normal. Ensuite, placez wp-config.php sous contrôle de version, mais gardez votre fichier include() séparé.

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');

Vous pouvez maintenant voir que les mots de passe et les hachages ne sont pas du tout inclus dans 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');

Mais honnêtement, à ce stade, vous ajoutez simplement un niveau d'abstraction redondant. La raison principale pour laquelle wp-config.php est séparé est qu’elle est spécifique à l’environnement. Vous ne devez absolument pas le copier depuis un serveur local vers la production. Par conséquent, il ne devrait pas être sous contrôle de version.

    
réponse donnée EAMann 22.05.2012 - 18:39
4

L'exemple de Mark suppose que vous travaillez avec un référentiel privé:

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'  );
}

Au lieu de définir les informations d'identification, vous pouvez tout aussi facilement créer un fichier production-config.php et l'inclure dans la vérification conditionnelle:

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' )
    }

Ensuite, dans votre version non configurée, production-config.php:

  define( 'DB_NAME',     'production_db'       );
  define( 'DB_USER',     'production_user'     );
  define( 'DB_PASSWORD', 'production_password' );
  define( 'DB_HOST',     'production_db_host'  );
    
réponse donnée Chris_O 25.05.2012 - 09:02
2

Vous pouvez valider le fichier wp-config.php dans le référentiel sans vos chaînes secrètes, puis exécuter:

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

Ceci indiquera à git de supposer que le fichier est, eh bien, inchangé.

    
réponse donnée getWeberForStackExchange 26.05.2012 - 00:44

Lire d'autres questions sur les étiquettes