Praktik terbaik untuk versi wp-config.php?

35

Apakah ada praktik terbaik untuk memasukkan wp-config.phpfile Anda di repositori kontrol versi Anda?

Saya sedang mempertimbangkan untuk membuat situs baru dengan jenis konfigurasi ini, (mirip dengan Alex King dan Mark Jaquith ):

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

Bagaimana saya bisa melakukan ini tanpa mengekspos kata sandi saya ke git, kalau-kalau repositori ini menjadi publik?

Khususnya di pos Mark, sepertinya local-config.php dapat menyimpan detail basis data dan kata sandi lokal, tetapi yang produksi tetap di wp-config.php. Apakah ini terlalu banyak masalah dan haruskah saya membiarkan wp-config.php tidak berversi?

Jonaton
sumber
Saya pikir cara Mark Jaquith melakukannya tidak banyak masalah dan berfungsi dengan baik dan sedikit lebih baik daripada jawaban di bawah ini.
Wyck
IMO, semuanya harus diletakkan di bawah kontrol versi dan sistem harus dapat menangani lingkungan yang berbeda tanpa hal-hal peretasan bersama menjaga hal-hal aman dan mudah untuk bekerja dengannya. Saya baru saja memposting tentang bagaimana saya melakukannya, yang mencakup semua masalah Anda :) Beritahu saya jika Anda memiliki pertanyaan tentang pengaturan saya.
Ashfame

Jawaban:

45

Inilah cara saya melakukannya dan saya belum menemukan yang lebih baik dari ini. Saya menyimpan versi yang berbeda dari file wp-config.php di bawah kontrol versi dan kemudian menyimpan file satu direktori di atas yang menampung semua kredensial dan garam / kunci basis data. Juga dengan cara ini, saya dapat membedakan antara jenis pengaturan yang saya jalankan dan melakukan hal-hal yang berbeda berdasarkan itu.

Ini adalah bagian yang wp-config.phpsaya simpan 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');

Dan di sini adalah file konfigurasi lokal yang saya simpan satu direktori di atas root WordPress dan ini juga membuatnya di luar direktori yang dapat diakses web, jadi jika apache berhenti mem-parsing file PHP dan mulai membuangnya, kredensial basis data kami masih aman ( 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');

Dengan cara ini jika file di atas dinamai local-config.php, sistem saya berperilaku seperti instalasi lokal. Jika diberi nama staging-config.php, berperilaku seperti instal pemasangan dan jika namanya production-config.php. Ini membantu saya memiliki nilai yang berbeda dari konstanta tertentu seperti debugging memiliki nilai yang berbeda di bawah lingkungan yang berbeda dan masih memiliki semuanya di bawah SCM (git). Kemungkinan tidak terbatas dan tidak ada peretasan yang diperlukan untuk lingkungan yang berbeda.

Ini memastikan Anda tidak pernah mengungkapkan informasi sensitif apa pun kepada publik dan saya menggunakan ini hanya untuk memulai proyek apa pun yang saya kerjakan, saya memiliki kunci yang lebih kuat di tempatnya secara default dan segera setelah saya menambahkannya ke file konfigurasi kedua satu direktori di atas, yang digunakan bukan yang didefinisikan di sini. Kebahagiaan!

Asfame
sumber
Saya suka pendekatan ini, saya mungkin akan akhirnya melakukan sesuatu seperti ini.
jjeaton
Bagaimana Anda mereferensikan direktori-local-config-file-in-the-parent-dari file konfigurasi utama? Melalui tautan simbolis, atau melalui ../(yaitu ../filename) suatu tempat? - Saya tidak menemukan apa pun ../di wp-config.phpfile utama .
KajMagnus
1
@ KajMagnus Konstanta DB_CREDENTIALS_PATHmelakukan itu.
Ashfame
9

Bagaimana saya bisa melakukan ini tanpa mengekspos kata sandi saya ke git, kalau-kalau repositori ini menjadi publik?

Jika wp-config.phpfile Anda ada dalam kontrol versi, maka semua kata sandi yang dikandungnya juga akan berada dalam kontrol versi. Satu-satunya cara untuk menghindarinya adalah dengan tidak meletakkan file di kontrol versi.

Apakah ini terlalu banyak masalah dan haruskah saya membiarkan wp-config.php tidak berversi?

Perasaan saya adalah untuk tetap wp-config.phptidak berversi sepenuhnya. Tetapi ada beberapa cara di sekitarnya.

Ekstrak bagian wp-config.phpyang berisi kata sandi dan hash Anda ke file terpisah dan include()di wp-config.phpfile biasa . Kemudian, letakkan di wp-config.phpbawah kontrol versi, tetapi include()pisahkan file Anda .

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

Anda dapat melihat sekarang bahwa kata sandi dan hash tidak dimasukkan wp-config.phpsama sekali.

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

Tapi jujur, pada titik ini Anda hanya menambahkan tingkat abstraksi yang berlebihan di sini. Seluruh alasan wp-config.phpterpisah pada awalnya adalah karena itu khusus lingkungan. Anda tidak boleh menyalinnya dari server lokal ke produksi sama sekali ... jadi tidak harus di bawah kontrol versi sama sekali.

EAMann
sumber
Ini memang tampak seperti pekerjaan tambahan, tapi saya bisa melihat manfaatnya dalam memastikan bahwa semua pengaturan wp-config berada di sinkronisasi antara lingkungan.
jjeaton
Memisahkan wp-config.phpmemiliki manfaat tambahan: Anda dapat memasukkan conf.phpke dalam skrip non-WP tanpa memuat keseluruhan WordPress.
Tamlyn
4

Contoh Markus menganggap Anda bekerja dengan repo pribadi:

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

Alih-alih mendefinisikan kredensial, Anda dapat dengan mudah membuat file production-config.php dan memasukkannya dalam pemeriksaan bersyarat:

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

Kemudian di production-config.php Anda yang tidak berversi:

  define( 'DB_NAME',     'production_db'       );
  define( 'DB_USER',     'production_user'     );
  define( 'DB_PASSWORD', 'production_password' );
  define( 'DB_HOST',     'production_db_host'  );
Chris_O
sumber
Bahkan jika itu repo pribadi, saya tidak ingin kata sandi disimpan di dalamnya, dan ingin fleksibilitas untuk membuat repo itu publik jika saya mau. Production-config.php mungkin cara yang baik untuk digunakan.
jjeaton
2

Anda bisa mengkomit wp-config.phpfile ke repositori tanpa string rahasia Anda, lalu jalankan:

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

Ini akan memberitahu git untuk berasumsi bahwa file tersebut, yah, tidak berubah.

getWeberForStackExchange
sumber
4
Baik untuk mengetahui, tidak mengetahui tentang assume-unchangedperalihan tetapi inilah dua poin saya: (1) Jika Anda git menambahkan file secara langsung, itu akan ditambahkan ke indeks. Jadi ada risiko Anda tidak sengaja dapat menambahkannya di beberapa titik. (2) Menggabungkan komit dengan flag ini aktif akan menyebabkan penggabungan gagal dengan anggun, sehingga Anda dapat menanganinya secara manual yang menjadikan ini bukan solusi yang elegan. Itu hanya dapat digunakan untuk mengabaikan perubahan sementara untuk sesuatu seperti sesi pengembangan. Di sini baca lebih lanjut - gitready.com/intermediate/2009/02/18/…
Ashfame