Wordpress和AWS CloudFront(很抱歉,您无法访问此页面。)

时间:2017-10-02 16:53:36

标签: php wordpress apache amazon-web-services

我一直在将网站从经典主机迁移到AWS(EC2 + CloudFront),我想使用Flexible-SSL,这意味着客户端(浏览器)使用SSL(HTTPS)与CloudFront通信,CloudFront调用使用HTTP的原因不安全。然后需要将“home”和“siteurl”设置为“https://www.myowndomain.com”,以便使用https生成所有网址,并避免重定向循环。

第一个问题是混合内容。我在 wp-config.php 中使用此代码解决了它(为了帮助需要它的人):

if (isset($_SERVER['HTTP_CLOUDFRONT_FORWARDED_PROTO']) && $_SERVER['HTTP_CLOUDFRONT_FORWARDED_PROTO'] == 'https'){
    $_SERVER['HTTPS']='on';
}

第二个问题仍然没有得到解决,并且花了我太多天......

当我进入wp-login并登录时...页面回复我:

  

403 - 很抱歉,您无法访问此页面

如果我回到主页,会显示带有菜单栏的网站,但是当我点击一个选项时,它会再次使用相同的消息(和HTTP状态)回复我。

来到这里之前我做过的事情:

  • 禁用所有插件,重命名为所有插件文件夹。
  • 使用wp-cli禁用插件。
  • 使用数据库中的wp-cli搜索并将所有“http://”字符串替换为“https://”。
  • 检查主页 siteurl wordpress变量是否为“https://www.myowndomain.com”。
  • 将主题更改为默认值。
  • 重新加载/删除.htaccess
  • 启用wordpress日志,不记录任何内容。
  • 检查所有权限,显然一切正常。
  • 检查数据库表前缀配置。
  • 使用Apache服务器端的取证模块检查所有标头。一些CloudFront标头已添加到请求中,但显然没有任何可能影响该问题的内容。
  • 检查wordpress所需的所有cookie是否由浏览器发送并由Apache服务器通过CloudFront接收: wordpress_logged_in_和wordpress_sec _
  • 调试一点点添加一些检查点到代码...但我不是wordpress开发人员,我要花很多钱来理解为什么会发生这种情况。 403页面是从函数 get_admin_page_parent()中的 /var/www/html/wp-admin/includes/plugin.php 触发的。
  • 一次又一次清理浏览器缓存。
  • 显然一次又一次地搜索。
真是一团糟!我采取的最后一项措施是做一个新鲜干净的wordpress安装。结果......一样。

我现在被困住了。欢迎提出任何建议。

提前致谢。

2 个答案:

答案 0 :(得分:0)

请检查此link是否有同样的问题,并通过修复损坏的wp-options表解决。希望这会对你有所帮助。

答案 1 :(得分:0)

1)在您的发行版的CloudFront Behaviors中,启用“将HTTP重定向到HTTPS”。

2)您需要将以下代码添加到wp-config.php。

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

if ( isset($_SERVER['HTTP_X_FORWARDED_FOR']) && !empty($_SERVER['HTTP_X_FORWARDED_FOR']) )
{
        $ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);

        $_SERVER['REMOTE_ADDR'] = trim($ips[0]);
}
elseif ( isset($_SERVER['HTTP_X_REAL_IP']) && !empty($_SERVER['HTTP_X_REAL_IP']) )
{
        $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_REAL_IP'];
} elseif ( isset($_SERVER['HTTP_CLIENT_IP']) && !empty($_SERVER['HTTP_CLIENT_IP']) )
{
        $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_CLIENT_IP'];
}