wp-config.php 버전 관리에 대한 모범 사례?


35

wp-config.php버전 관리 저장소에 파일 을 포함시키는 가장 좋은 방법이 있습니까?

이 유형의 구성을 사용하여 새 사이트를 만드는 것을 고려하고 있습니다 ( Alex KingMark Jaquith 와 유사 ).

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

이 저장소가 공개 될 때 암호를 git에 노출시키지 않고 어떻게 할 수 있습니까?

특히 Mark의 게시물에서 local-config.php가 로컬 데이터베이스 세부 정보 및 암호를 저장할 수있는 것처럼 보이지만 프로덕션 암호는 wp-config.php에 남아 있습니다. 이것은 너무 많은 문제이며 wp-config.php를 버전없는 상태로 두어야합니까?


Mark Jaquith 가하는 방식은 많은 문제가 아니며 잘 작동하며 아래 답변보다 약간 낫습니다.
Wyck

IMO는 모든 것이 버전 관리를 통해 이루어져야하며 시스템은 해커가 없어도 다양한 환경을 처리 할 수 ​​있어야합니다. 방금 내가 어떻게하는지에 대해 게시했는데, 모든 우려 사항을 다루고 있습니다 :) 내 설정에 대해 궁금한 점이 있으면 알려주십시오.
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 루트 위에 하나의 디렉토리를 유지하는 로컬 구성 파일이 있으며 이는 웹 액세스 디렉토리 외부에 디렉토리를 만듭니다. 따라서 아파치가 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-directory를 어떻게 참조합니까? 심볼릭 링크를 통해 또는 어딘가 를 통해 ../(예 ../filename:)? — ../기본 wp-config.php파일 에서 아무것도 찾지 못했습니다 .
KajMagnus

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 설정이 환경간에 동기화되도록하는 이점을 볼 수 있습니다.
jjeaton

분할 wp-config.php하면 추가적인 이점이 있습니다 conf.php. WordPress 전체를로드하지 않고도 비 WP 스크립트에 포함시킬 수 있습니다 .
Tamlyn

4

Mark의 예제 는 개인 저장소로 작업한다고 가정합니다.

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는 아마도 좋은 방법 일 것입니다.
jjeaton 10

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.