web-dev-qa-db-ja.com

$ base_rootの問題

/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の問題に関する多くの「意図したとおりに機能する」応答を見てきました。

2
Charles Letcher

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);
3
4k4