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

35

Existe-t-il une bonne pratique pour inclure votre wp-config.phpfichier 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 dépôt deviendrait public?

En particulier dans le message de Mark, il semble que le fichier local-config.php puisse stocker les informations 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?

Jeaton
la source
Je pense que la façon dont Mark Jaquith fait ça ne pose pas beaucoup de problèmes et fonctionne bien et est légèrement meilleure que la réponse ci-dessous.
Wyck
OMI, tout doit être placé sous contrôle de version et le système doit être capable de gérer différents environnements sans aucun trucage de piratage tout en maintenant la sécurité et la simplicité d'utilisation. Je viens de poster sur la façon dont je le fais, qui couvre toutes vos préoccupations :) Faites-moi savoir si vous avez des questions sur ma configuration.
Ashfame

Réponses:

45

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 cette manière, je peux également 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.phpje garde sous 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');

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 de connexion à la base de données sont toujours sûres ( 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');

Ainsi, si le fichier ci-dessus est nommé local-config.php, mon système se comporte comme une installation locale. Si son nom est nommé staging-config.php, il se comporte comme une installation intermédiaire et s’il est nommé 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 simplement pour démarrer tout projet sur lequel je travaille. J'ai des clés plus fortes en place par défaut et dès que je les ajoute au deuxième fichier de configuration dans le répertoire ci-dessus, ceux-ci sont utilisés à la place de ceux définis ici. Félicité!

Ashfame
la source
J'aime cette approche, je vais probablement finir par faire quelque chose comme ça.
jeudi
Comment référencez-vous le fichier-local-config-dans-le-répertoire-parent à partir du fichier de configuration principal? Via un lien symbolique, ou via ../( ../filenamequelque part)? - Je n'en ai trouvé aucun ../dans le wp-config.phpfichier principal .
KajMagnus
1
@KajMagnus La constante DB_CREDENTIALS_PATHfait que.
Ashfame
9

Comment puis-je faire cela sans exposer mes mots de passe à git, au cas où ce dépôt deviendrait public?

Si votre wp-config.phpfichier est sous contrôle de version, tous les mots de passe qu'il contient le seront également . 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 intuition serait de ne pas wp-config.phpparler entièrement. Mais il existe des moyens de contourner le problème.

Extrayez la partie wp-config.phpqui contient vos mots de passe et les hachages dans un fichier séparé et include()le dans le wp-config.phpfichier normal . Ensuite, placez-le wp-config.phpsous contrôle de version, mais gardez votre include()fichier 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 voir maintenant que les mots de passe et les hachages ne sont pas inclus du wp-config.phptout.

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 wp-config.phpest distincte en premier lieu car elle est spécifique à l'environnement. Vous ne devriez pas du tout le copier d'un serveur local en production ... donc il ne devrait pas du tout être sous contrôle de version.

EAMann
la source
Cela semble un travail supplémentaire, mais je peux voir les avantages de la synchronisation de tous les paramètres de wp-config entre les environnements.
jeudi
La scission wp-config.phpa un avantage supplémentaire: vous pouvez inclure conf.phpdans un script non-WP sans charger tout WordPress.
Tamlyn
4

L'exemple de Mark suppose que vous travaillez avec un dépôt 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' )
    }

Puis dans votre version non-production-config.php:

  define( 'DB_NAME',     'production_db'       );
  define( 'DB_USER',     'production_user'     );
  define( 'DB_PASSWORD', 'production_password' );
  define( 'DB_HOST',     'production_db_host'  );
Chris_O
la source
Même s'il s'agit d'un dépôt privé, je ne voudrais pas que les mots de passe y soient stockés, et je voudrais pouvoir le rendre public si je le souhaite. Le fichier production-config.php est probablement une bonne solution.
jeudi
2

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

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

Cela indiquera à git de supposer que le fichier n’est pas modifié.

getWeberForStackExchange
la source
4
Bon à savoir, je n’étais pas au courant du assume-unchangedcommutateur, mais voici mes deux points: (1) Si vous ajoutez le fichier directement, il sera ajouté à l’index. Il existe donc un risque que vous puissiez l'ajouter accidentellement à un moment donné. (2) La fusion d'un commit avec cet indicateur activé entraînera l'échec de la fusion, ce qui vous permettra de le gérer manuellement, ce qui en fait une solution peu élégante. Il ne peut être utilisé que pour ignorer temporairement les modifications lorsqu’il s’agit d’une session de développement. Ici, lisez plus - gitready.com/intermediate/2009/02/18/…
Ashfame