将$ _SERVER ['HTTPS'] ='on'设置为禁止访问wp-admin


16

首先,我的服务器位于负载均衡器后面。我的SSL证书位于负载平衡器上,并处理HTTPS。来自端口443的数据将使用端口80上的HTTP转发到Wordpress服务器。

但是,wordpress和php不知道我的服务器配置。这会使浏览器对我有效的SSL证书的有效性产生怀疑。

为了解决这个问题,我将以下代码添加到functions.php中。我在这里找到了此代码,而法典对此表示同意

/**
 * Make PHP HTTPS aware via HTTP_X_FORWARDED_PROTO
 */
if(isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
    $_SERVER['HTTPS']='on';
}

这对于前端非常有用,但是现在即使使用我的管理员帐户也无法访问/ wp-admin /。登录后,我收到一条消息,“抱歉,不允许您访问此页面。” 没有提供其他帮助。

因此,我在wp-admin文件夹中进行了搜索,发现“抱歉,不允许您访问此页面”。出现17次不同的时间。

这些错误消息大多数与用户权限检查相关联。

如何使HTTPS保持打开状态并保留管理员访问权限?

摘要:

  • 在将HTTP_X_FORWARDED_PROTO逻辑添加到functions.php之前,我可以访问wp-admin /
  • 将HTTP_X_FORWARDED_PROTO逻辑添加到functions.php后,我无法访问wp-admin /
  • 将HTTP_X_FORWARDED_PROTO逻辑删除到functions.php后,我无法访问wp-admin /

更新:

我发现错误消息来自wp-admin / menu.php,而这部分代码位于底部。我menu.php在错误的末尾添加了内容,以找出它是该文件。

if ( !user_can_access_admin_page() ) {

    /**
     * Fires when access to an admin page is denied.
     *
     * @since 2.5.0
     */
    do_action( 'admin_page_access_denied' );

    wp_die( __( 'Sorry, you are not allowed to access this page. menu.php'), 403 );
}

我仍然不知道如何解决此问题。


1
您无需对配置的其余部分说太多。您设定了吗define('FORCE_SSL_ADMIN', true);
user42826

我没有定义“ FORCE_SSL_ADMIN”。我会试试看。
nu珠穆朗玛峰

您需要检查是否也通过http从负载均衡器发送了https cookie。听起来好像没有发送。显然,还需要检查另一种方法,即您设置的cookie是否通过https传输
Mark Kaplun 2016年

Answers:


19

特别感谢user42826。

根据法典:

如果WordPress托管在提供SSL的反向代理之后,但托管自身却没有SSL,则这些选项将首先将所有请求发送到无限重定向循环中。为了避免这种情况,您可以将WordPress配置为识别HTTP_X_FORWARDED_PROTO标头(假设您已经正确配置了反向代理来设置该标头)。

以下操作将解决该问题。

将此添加到wp-config.php。(食典参考

/* SSL Settings */
define('FORCE_SSL_ADMIN', true);

/* Turn HTTPS 'on' if HTTP_X_FORWARDED_PROTO matches 'https' */
if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false) {
    $_SERVER['HTTPS'] = 'on';
}

由于没有必要,请从functions.php中删除它。

/**
 * Make PHP HTTPS aware via HTTP_X_FORWARDED_PROTO
 */
if(isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
    $_SERVER['HTTPS']='on';
}

1
原因是安全会话cookie在负载均衡器后面时会丢失,因为LB正在使用SSL,但后端是纯http。很高兴看到其他人在企业级架构上工作;)
user42826

@ user42826这种设置的好处是,如果我想禁止管理员访问,可以将FORCE_SSL_ADMIN注释掉,或者是否有其他副作用使我重新考虑这种思路?
nu Everest,2016年

1
在您的设置中,听起来好像没有设置FORCE_SSL_ADMIN会阻止管理员访问,但是根据您的要求,有更好的方法来执行此操作。示例:防止在.htaccess或apache配置中访问wp-admin或wp-login.php,通过插件删除WP本机身份验证,重新架构WP,以使wp-admin url与公共url不同,等等
user42826

6
确保在此require_once(ABSPATH . 'wp-settings.php');行之前添加此代码。特别感谢jtl在这个答案中。
Aaroninus

@Aaroninus谢谢,我使用Cloudflare flexible SSL,如果没有您的评论,我会花时间再次搜索。我之前发现了这个相关问题:wordpress.stackexchange.com/questions/170165/…–
baptx
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.