web-dev-qa-db-ja.com

Amazon Load Balancerの背後にある場合のWordPress HTTPSの問題を修正するには?

私は前にこの問題を経験したことがあります。 AmazonのEC2 Load Balancerの背後でWordPress(または他のPHPスクリプト))を実行すると、スクリプトはhttps://プロトコルで実行されていることを認識しません。無限のリダイレクトループやHTTPS警告などの問題が発生します(「このページの一部のコンテンツは安全でない方法でリクエストされています...」)。

私はここで解決策を見つけましたが、WordPressコアを変更する必要があり、これは更新可能性に適していません: https://wordpress.org/support/topic/when-behind-Amazon- web-services-elastic-load-balance-causes-endless-redirect

WordPress coreを変更せずにこれを修正する方法はありますか?Apache 2.2を使用しています。

45
A.B. Carroll

あなたが提供したリンクが示唆したように、WordPress=の問題はis_ssl()関数にあり、ほとんどのPHPソフトウェアは明示的に$_SERVER['HTTPS']$_SERVER['SERVER_PORT']をチェックして現在のページはhttps://コンテキストでアクセスされています。

ページがHTTPS経由でアクセスされているが、Amazon Load BalancerがSSLオフロードを実行しており、実際に非SSLポート80、ウェブサーバー、PHP、または他の何かでコンテンツを要求している場合、そのことを理解または表示しませんhttps://経由でアクセスします。

これに対する修正は、AmazonのELBが事実上の標準X-Forwareded-Proto HTTPヘッダーを送信することです。これを使用して、クライアントが実際ロードバランサーの反対側で使用しているプロトコルを判別できます。

Apache 2.2では、次のラインに沿って何かを使用できます。

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

これは単にX-Forwared-Protoヘッダーを読み取り、httpsと等しい場合、HTTPS環境変数を1に設定します。 PHPはこの環境変数を参照し、最終的には$_SERVER['HTTPS']に等しくなる1になります-「実際の」ネイティブSSLリクエストの場合と同じです。

62
A.B. Carroll

WordPress documentation からの別のオプションは、これをwp-config.phpに追加することです:

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

他の誰かがこれと同等の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ファイルに含まれていました)。

10
Gal Talmor

この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]
6
Ankit Anand

上記のいずれも、残念ながら混合コンテンツのエラーを解決しませんでした。しかし、機能したのは、wp-config.phpのWP_HOME && WP_SITEURL変数にプロトコルを追加することでした。

define( 'WP_HOME', 'https://' . $_SERVER['HTTP_Host']); define( 'WP_SITEURL', WP_HOME );

その後、ソースのすべてのURLがhttpsで始まり、すべての混合コンテンツエラーが消えました。

4
Mike