/core/lib/Drupal/Core/DrupalKernal.phpで、$ base_rootに誤った値が表示されます。
1113行目:protected function initializeRequestGlobals(Request $ request){global $ base_url; //この関数によって$ base_urlを設定および派生します。グローバル$ base_path、$ base_root;グローバル$ base_secure_url、$ base_insecure_url;
// Create base URL.
$base_root = $request->getSchemeAndHttpHost();
$ base_rootが示す値は、要求されたURLではなくマシン名です。具体的には、$ base_rootの値は次のようになります。 https://machinename.windows.domain.com 次のようなリクエストURLではありません https://ourcompany.com
データベース、エクスポートされた構成、およびインストール内のすべてのファイルで「machinename」を検索しましたが、存在する唯一の場所は「my computer」名としてWindowsサーバー上にあります。
私たちの環境は、Windows EC2サーバーにトラフィックを中継するAWSロードバランサー、ロードバランサー上のAWS証明書でセットアップされています。
PHPおよびDrupal 8.7.14。composerを使用して更新されたモジュールを実行しています。これはバグではないと思います。
これにより発生する問題は、リダイレクトURLまたはWebフォームやワークフローモジュールなどの自己参照がある場合に、マシン名URLに外部からアクセスできないためにエラーが発生することです。
Str_replace()を使用して$ base_rootを変更するDrupalKernel.phpをハックするコードを書きました。これをRedirectResponseSubscriber.phpに対しても行いました。これは私の問題を修正します。しかし、これは最悪の種類のハックプログラミングです。
Symfonyの$ request-> getSchemeAndHttpHost()に適切なURLを強制的に与える方法はありますか?多分私が逃した設定ですか?
私はこの質問を明らかにすることができる批判のため、この質問を投稿するのを非常にためらっていました。私の場合には役に立たない$ base_urlの問題に関する多くの「意図したとおりに機能する」応答を見てきました。
Settings.phpの「Reverse Proxy Configuration」を確認してください:
/**
* Reverse Proxy Configuration:
*
* Reverse proxy servers are often used to enhance the performance
* of heavily visited sites and may also provide other site caching,
* security, or encryption benefits. In an environment where Drupal
* is behind a reverse proxy, the real IP address of the client should
* be determined such that the correct client IP address is available
* to Drupal's logging, statistics, and access management systems. In
* the most simple scenario, the proxy server will add an
* X-Forwarded-For header to the request that contains the client IP
* address. However, HTTP headers are vulnerable to spoofing, where a
* malicious client could bypass restrictions by setting the
* X-Forwarded-For header directly. Therefore, Drupal's proxy
* configuration requires the IP addresses of all remote proxies to be
* specified in $settings['reverse_proxy_addresses'] to work correctly.
*
* Enable this setting to get Drupal to determine the client IP from the
* X-Forwarded-For header. If you are unsure about this setting, do not have a
* reverse proxy, or Drupal operates in a shared hosting environment, this
* setting should remain commented out.
*
* In order for this setting to be used you must specify every possible
* reverse proxy IP address in $settings['reverse_proxy_addresses'].
* If a complete list of reverse proxies is not available in your
* environment (for example, if you use a CDN) you may set the
* $_SERVER['REMOTE_ADDR'] variable directly in settings.php.
* Be aware, however, that it is likely that this would allow IP
* address spoofing unless more advanced precautions are taken.
*/
# $settings['reverse_proxy'] = TRUE;
/**
* Specify every reverse proxy IP address in your environment.
* This setting is required if $settings['reverse_proxy'] is TRUE.
*/
# $settings['reverse_proxy_addresses'] = ['a.b.c.d', ...];
/**
* Reverse proxy trusted headers.
*
* Sets which headers to trust from your reverse proxy.
*
* Common values are:
* - \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_ALL
* - \Symfony\Component\HttpFoundation\Request::HEADER_FORWARDED
*
* Note the default value of
* @code
* \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_ALL | \Symfony\Component\HttpFoundation\Request::HEADER_FORWARDED
* @endcode
* is not secure by default. The value should be set to only the specific
* headers the reverse proxy uses. For example:
* @code
* \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_ALL
* @endcode
* This would trust the following headers:
* - X_FORWARDED_FOR
* - X_FORWARDED_Host
* - X_FORWARDED_PROTO
* - X_FORWARDED_PORT
*
* @see \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_ALL
* @see \Symfony\Component\HttpFoundation\Request::HEADER_FORWARDED
* @see \Symfony\Component\HttpFoundation\Request::setTrustedProxies
*/
# $settings['reverse_proxy_trusted_headers'] = \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_ALL | \Symfony\Component\HttpFoundation\Request::HEADER_FORWARDED;
Symfonyのドキュメントにさらに情報があります https://symfony.com/doc/current/deployment/proxies.html
デバッグ
デバッグするには、index.phpに行を追加し、CDNが送信するヘッダーを確認します。
index.php:
<?php
/**
* @file
* The PHP page that serves all page requests on a Drupal installation.
*
* All Drupal code is released under the GNU General Public License.
* See COPYRIGHT.txt and LICENSE.txt files in the "core" directory.
*/
use Drupal\Core\DrupalKernel;
use Symfony\Component\HttpFoundation\Request;
// remove after debugging
var_dump($_SERVER);