私は前にこの問題を経験したことがあります。 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を使用しています。
あなたが提供したリンクが示唆したように、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リクエストの場合と同じです。
WordPress documentation からの別のオプションは、これをwp-config.phpに追加することです:
if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false)
$_SERVER['HTTPS']='on';
他の誰かがこれと同等の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
ファイルに含まれていました)。
この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]
上記のいずれも、残念ながら混合コンテンツのエラーを解決しませんでした。しかし、機能したのは、wp-config.phpのWP_HOME && WP_SITEURL変数にプロトコルを追加することでした。
define( 'WP_HOME', 'https://' . $_SERVER['HTTP_Host']); define( 'WP_SITEURL', WP_HOME );
その後、ソースのすべてのURLがhttpsで始まり、すべての混合コンテンツエラーが消えました。