Php

反向代理後面的子目錄中的 Drupal

  • December 27, 2021

在我面向公眾的主機上,Apache 充當非公共主機的反向代理,其中 Drupal 9 實例在 Web 根目錄下進行符號連結。Drupal 回答請求,但它輸出包含符號連結名稱的任何本地連結。顯然是因為 PHP 請求變數$_SERVER['SCRIPT_NAME']包含它。

我如何告訴 Drupal 它的“實際”基本路徑?

細節

公共主機配置:

<Location "/">
 ProxyPreserveHost on
 ProxyPassReverse "https://otherserver/webb/"
</Location>

在 上otherserver,我的域example.com是一個虛擬主機,其根目錄位於/var/www/sites/example.com/html. 有這個符號連結webb,指向 Drupal 位置:

/var/www/sites/example.com/html/webb -> /var/www/sites/example.com/html/drupal8/web/

Drupal 會響應,但在響應 HTML 中,應該指向的連結是指向/about/webb/about資產等也是如此。

如果我回應$_SERVER['SCRIPT_NAME'],我得到/webb/index.php

我通過改變REQUEST_URI和解決SCRIPT_NAME了這個問題settings.php

$trim_path = '/webb';
if (isset($GLOBALS['request'])) {
 $request = $GLOBALS['request'];
 if ($request->server->get('SCRIPT_NAME') == "$trim_path/index.php") {
   $request->server->set('SCRIPT_NAME', '/index.php');
   $request_uri = substr($request->server->get('REQUEST_URI'), strlen($trim_path));
   $request->server->set('REQUEST_URI', $request_uri);
 }
}

對我能找到的最早提到這個想法的 lightsurge 表示敬意。

引用自:https://serverfault.com/questions/1086296