如何修复WordPress HTTPS问题时,背后的亚马逊负载均衡器?

aiqt4smr  于 2023-05-06  发布在  WordPress
关注(0)|答案(7)|浏览(168)

我以前也遇到过这种情况。当在Amazon的EC2负载均衡器后面运行WordPress(或其他PHP脚本)时,脚本没有意识到它们正在https://协议上运行,并导致无休止的重定向循环和HTTPS警告(“此页面上的某些内容正在以不安全的方式请求......”)等问题。
我在这里找到了一个解决方案,但需要修改WordPress核心,这对可更新性没有好处:https://wordpress.org/support/topic/when-behind-amazon-web-services-elastic-load-balancer-causes-endless-redirect
有没有办法在不修改WordPress核心的情况下解决这个问题?我用的是Apache 2.2。

js81xvg6

js81xvg61#

就像你建议的链接一样,对于WordPress,问题在于is_ssl()函数,它像大多数PHP软件一样显式检查$_SERVER['HTTPS']$_SERVER['SERVER_PORT'],以检查当前页面是否在https://上下文中访问。
当您的页面通过HTTPS访问,但Amazon Load Balancer正在执行SSL卸载并实际在非SSL端口80上请求您的内容时,Web服务器、PHP或其他任何东西都无法理解或看到它正在通过https://访问。
对此的解决方案是Amazon的ELB发送事实上的标准X-Forwarded-Proto HTTP头,我们可以使用它来确定客户端在负载均衡器的另一端实际使用的是哪个协议。
在Apache 2.2中,你可以使用如下代码:

<IfModule mod_setenvif.c>
  SetEnvIf X-Forwarded-Proto "^https$" HTTPS
</IfModule>

这只是读取X-Forwarded-Proto头。如果该值等于https,则HTTPS环境变量设置为1。PHP将看到这个环境变量,最终它将变成$_SERVER['HTTPS'],它等于1--就像“真实的的”原生SSL请求一样。

y1aodyip

y1aodyip2#

WordPress文档中的另一个选项是将其添加到wp-config.php:

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

wpcxdonn3#

如果其他人正在寻找与此等效的Nginx,这里是你需要做的:
对于重写设置,您应该在server块下添加以下内容:

if ($http_x_forwarded_proto != 'https') {
    rewrite ^ https://$host$request_uri? permanent;
}

为了设置HTTPS参数,您应该在location ~ \.php$块下添加以下内容:

if ($http_x_forwarded_proto = 'https') {
    set $fe_https 'on';
}
fastcgi_param HTTPS $fe_https;

记住删除任何其他fastcgi_param HTTPS命令(如果有)(我的fastcgi_params文件中有)。

2eafrhcq

2eafrhcq4#

使用这4个步骤的方法来消除在WordPress中使用SSL时的重定向循环和混合内容问题。
1)将数据库中的'http://'替换为'//'-这将创建图像和其他资源的所有相对URL
2)在wp-config中,定义通用wp_home和wp_siteurl变量。

define('WP_HOME','//'. $_SERVER['SERVER_NAME']);
define('WP_SITEURL','//'. $_SERVER['SERVER_NAME']);

3)如果您使用的是负载均衡器,请使用“HTTP_X_FORWARDED_PROTO”服务器变量来确定所使用的协议。为此,在wp-config中添加这一行

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

4)最后,在.htaccess中,如果你在负载均衡器后面,使用这一行将所有流量重定向到https。

# http to https
 RewriteCond %{HTTP:X-Forwarded-Proto} =http
 RewriteRule . https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
0md85ypi

0md85ypi5#

不幸的是,上述两种方法都没有解决我的混合内容错误。然而,真正起作用的是将协议添加到wp-config.php中的WP_HOME && WP_SITEURL变量中,例如。
define( 'WP_HOME', 'https://' . $_SERVER['HTTP_HOST']); define( 'WP_SITEURL', WP_HOME );
之后,源代码中的所有URL都以https开头,所有混合内容错误都消失了。

fykwrbwg

fykwrbwg6#

我的服务器环境是:Ubuntu 20.04.3 LTS, PHP 8.0.11, nginx/1.18.0
/etc/nginx/sites-available/default中的以下设置对我有效:

server {

    listen 80;
    listen [::]:80;
    root /var/www/html;
    index  index.php index.html index.htm;
    server_name ChangeDomainName.com www.ChangeDomainName.com;

    if ($http_x_forwarded_proto != 'https') {
        rewrite ^ https://$host$request_uri? permanent;
    }

    location / {
            try_files $uri $uri/ /index.php?$args;
    }
    location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/run/php/php8.0-fpm.sock;
            if ($http_x_forwarded_proto = 'https') {
                set $fe_https 'on';
            }
            fastcgi_param HTTPS $fe_https;
            fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}
dm7nw8vv

dm7nw8vv7#

关于几乎完美的@A.B.卡罗尔回答,我建议将此环境变量设置为“on”:

<IfModule mod_setenvif.c>
  SetEnvIf X-Forwarded-Proto "^https$" HTTPS=on
</IfModule>

在我的Dockerfile中,我包含了这一行来解决反向代理(即Traeffik)背后的Apache问题:

RUN echo "<IfModule mod_setenvif.c>\nSetEnvIf X-Forwarded-Proto \"^https$\" HTTPS=on\n</IfModule>" > /etc/apache2/conf-enabled/ssl_offload.conf

相关问题