Azure / wordpress-linux-appservice

MIT License
96 stars 65 forks source link

CUSTOM_DOMAIN not working correctly #140

Closed tomaustin700 closed 3 months ago

tomaustin700 commented 3 months ago

Hi, We have the app service hosted behind front door, we have AFD_ENABLED set to true, AFD_ENDPOINT set to the endpoint in FrontDoor and also CUSTOM_DOMAIN set to the custom domain that we have set within FrontDoor also. However we are still seeing the WordPress Address and Site URL within Wordpress being set to the default domain of the app service (.azurewebsite.net). Are we missing something here?

Thanks

RobHudson72 commented 3 months ago

I dug into wp-config.php, and it appears that the Request Host Header is being replaced with an environment variable named APP_DOMAIN.

I tried setting an APP_DOMAIN application setting pointed to the custom domain, and it didn't work.

Grasping at straws, I changed the AFD_ENDPOINT to the custom domain. And boom. Everything works. I've been trying to break the site for an hour now, and it all just works.

I do not have the Custom Domain configured in the App Service. Instead, in FrontDoor, I have the Origin Header pointed to the App Service domain foo1.azurewebsites.net. AFD is handling the custom domain, and flawlessly functioning as the reverse proxy.

Hope this is helpful to someone, because this issue has plagued me for hours.

EDIT: I did take the additional step of configuring the custom domain in AFD, in the Domains blade

tomaustin700 commented 3 months ago

Thanks @RobHudson72, glad it's not just me who has been struggling with this. So just so I'm clear, you added an application setting called APP_ENDPOINT with the value of the custom domain in AFD and then it all just worked? Thanks

RobHudson72 commented 3 months ago

Thanks @RobHudson72, glad it's not just me who has been struggling with this. So just so I'm clear, you added an application setting called APP_ENDPOINT with the value of the custom domain in AFD and then it all just worked? Thanks

Sorry, Typo. No, I didn't add a new setting. I changed the existing AFD_ENDPOINT setting to point to the custom domain.

Then, in AFD, I configured the custom domain under Domains.

Editing my post so it doesn't steer anyone else wrong

tomaustin700 commented 3 months ago

@RobHudson72 Thanks. Do you also have CUSTOM_DOMAIN set? Just trying to work out what actually is needed to be set. After your suggested change I'm still seeing the app service domain within the wordpress admin panel, is that the same for you or are you seeing the AFD custom domain?

RobHudson72 commented 3 months ago

@tomaustin700 I don't have CUSTOM_DOMAIN application setting set.

In wp-admin, both WordPress Address and Site Address are disabled, read-only, and displaying the value of the custom domain.

After the install, I performed an import from another hosting provider using the All-In-One WP Migration plugin. I don't know the internals of that tool, and it's possible that it changed the behavior of the environment.

Including here my current wp-config.php file:

<?php
/** Enable W3 Total Cache */
define('WP_CACHE', true); // Added by W3 Total Cache

/**
 * The base configuration for WordPress
 *
 * The wp-config.php creation script uses this file during the installation.
 * You don't have to use the web site, you can copy this file to "wp-config.php"
 * and fill in the values.
 *
 * This file contains the following configurations:
 *
 * * Database settings
 * * Secret keys
 * * Database table prefix
 * * ABSPATH
 *
 * @link https://wordpress.org/support/article/editing-wp-config-php/
 *
 * @package WordPress
 */

/** overriding HTTP_HOST header */
if (!empty(getenv('AFD_DOMAIN'))) {
    $_SERVER['HTTP_HOST'] = getenv('AFD_DOMAIN');
}

//Using environment variables for memory limits
$wp_memory_limit = (getenv('WP_MEMORY_LIMIT') && preg_match("/^[0-9]+M$/", getenv('WP_MEMORY_LIMIT'))) ? getenv('WP_MEMORY_LIMIT') : '128M';
$wp_max_memory_limit = (getenv('WP_MAX_MEMORY_LIMIT') && preg_match("/^[0-9]+M$/", getenv('WP_MAX_MEMORY_LIMIT'))) ? getenv('WP_MAX_MEMORY_LIMIT') : '256M';

/** General WordPress memory limit for PHP scripts*/
define('WP_MEMORY_LIMIT', $wp_memory_limit );

/** WordPress memory limit for Admin panel scripts */
define('WP_MAX_MEMORY_LIMIT', $wp_max_memory_limit );

//Using environment variables for DB connection information

// ** Database settings - You can get this info from your web host ** //
$connectstr_dbhost = getenv('DATABASE_HOST');
$connectstr_dbname = getenv('DATABASE_NAME');
$connectstr_dbusername = getenv('DATABASE_USERNAME');
$connectstr_dbpassword = getenv('DATABASE_PASSWORD');

/** The name of the database for WordPress */
define('DB_NAME', $connectstr_dbname);

/** MySQL database username */
define('DB_USER', $connectstr_dbusername);

/** MySQL database password */
define('DB_PASSWORD',$connectstr_dbpassword);

/** MySQL hostname */
define('DB_HOST', $connectstr_dbhost);

/** 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', '' );

/** Enabling support for connecting external MYSQL over SSL*/
$mysql_sslconnect = (getenv('DB_SSL_CONNECTION')) ? getenv('DB_SSL_CONNECTION') : 'true';
if (strtolower($mysql_sslconnect) != 'false' && !is_numeric(strpos($connectstr_dbhost, "127.0.0.1")) && !is_numeric(strpos(strtolower($connectstr_dbhost), "localhost"))) {
    define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);
}

/**#@+
 * 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',         'FBq{O-Mtspss11dqSkc.&u^s4DAx_~z.gzZjyV_!Jaw#^7i9{L&PHh55[f[B<vHS' );
define( 'SECURE_AUTH_KEY',  '?[4$SX2:/Meu`:Vy;HZ31bIiDIX;l92boPX;uAq#vjuIk_B 8FLz`-v SN-wuSi[' );
define( 'LOGGED_IN_KEY',    '&yP7!nQy&DMhAb+>0xJz+z$:nm9&u98OU=DZ}uIFb<cY<i`VDU#s-SX|`T6wp?)' );
define( 'NONCE_KEY',        '@a~-<eB}v!cK:*|7x[`u{H=?}r_3!rQzJt%drQN{5?G9/}2*(/0OOe2iM99kIX!w' );
define( 'AUTH_SALT',        '3,Em?9F$;zx[#j/JTS%kx8C[Rj4Rc58z(<=ySRMa@x0][9&X~jbp_Km+^0fp/FHS' );
define( 'SECURE_AUTH_SALT', 'h>qE26Ws>Org#bLb{S.iu7A9@Fn/#5-sH0#6WM.q;X*@UK1*ydlxaI.YUGxKzsqk' );
define( 'LOGGED_IN_SALT',   '5{]l=D(*Q#=|.i*mb$U_gYX4]/<a%NjyzR2P_=1,SNxvjWF~:3152;jh*kT%+EXQ' );
define( 'NONCE_SALT',       '=Y|4Q{I>%kD[J4V;> j/n5p(CHI*$6K;+Us3+e.TA#VXf#GT.uV02v^4[r6dqaXS' );

/**#@-*/

/**
 * 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_';

/**
 * 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.
 *
 * For information on other constants that can be used for debugging,
 * visit the documentation.
 *
 * @link https://wordpress.org/support/article/debugging-in-wordpress/
 */
define( 'WP_DEBUG', false );

/* That's all, stop editing! Happy blogging. */
/**https://developer.wordpress.org/reference/functions/is_ssl/ */
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
    $_SERVER['HTTPS'] = 'on';

$http_protocol='http://';
if (!preg_match("/^localhost(:[0-9])*/", $_SERVER['HTTP_HOST']) && !preg_match("/^127\.0\.0\.1(:[0-9])*/", $_SERVER['HTTP_HOST'])) {
    $http_protocol='https://';
}

//Relative URLs for swapping across app service deployment slots
define('WP_HOME', $http_protocol . $_SERVER['HTTP_HOST']);
define('WP_SITEURL', $http_protocol . $_SERVER['HTTP_HOST']);
define('WP_CONTENT_URL', '/wp-content');
define('DOMAIN_CURRENT_SITE', $_SERVER['HTTP_HOST']);

/** Absolute path to the WordPress directory. */
if ( ! defined( 'ABSPATH' ) ) {
    define( 'ABSPATH', __DIR__ . '/' );
}

/** Sets up WordPress vars and included files. */
require_once ABSPATH . 'wp-settings.php';
RobHudson72 commented 3 months ago

@tomaustin700 , did that work for ya?

tomaustin700 commented 3 months ago

Hey @RobHudson72, all fixed - thanks so much! The missing link was

/** overriding HTTP_HOST header */
if (!empty(getenv('AFD_DOMAIN'))) {
    $_SERVER['HTTP_HOST'] = getenv('AFD_DOMAIN');
}

Which we didn't have in our wp-config.php for some reason. After I added that everything worked as expected.