跳轉至

config.inc.php深入

web/config.inc.php 是每個 MRBS 安裝執行個體自己的設定檔。它定義網站特有的行為,通常也包含機密資訊。請將其當作正式環境設定管理,而不是應用程式原始碼檔案。

建立文件

MRBS 運送web/config.inc.php-sample,但故意不運送活動的config.inc.php。

cd /var/www/mrbs
cp config.inc.php-sample config.inc.php

從同一 MRBS 版本中的範例開始。不要將舊樣本原樣保留。

如何載入設定

共用引導程式會依照以下順序載入設定:

  1. systemdefaults.inc.php
  2. areadefaults.inc.php
  3. config.inc.php
  4. site_config.inc
  5. 內部驗證和相容性處理

後面的分配會覆蓋前面的分配。這就是為什麼短的 config.inc.php 可以在不修改發布檔案的情況下替換應用程式預設值。

flowchart LR
  System[System defaults] --> Area[New-area defaults]
  Area --> Local[config.inc.php]
  Local --> Site[Site-specific config]
  Site --> Check[Validation and compatibility]

Important

已儲存在資料庫中的面積值可透過會議室/設備進行編輯。更改 areadefaults.inc.php 或覆蓋 config.inc.php 不會重寫現有區域。

PHP語法

該設定是可執行的PHP。每個語句都以分號結尾。字串可以使用單引號或雙引號:

$timezone = 'Europe/Berlin';
$default_view = "week";
$kiosk_mode_enabled = false;
$search["count"] = 30;

使用真正的 PHP 布林值,而不是字串:

$mail_settings['disabled'] = false;   // Correct
$mail_settings['disabled'] = "false"; // Wrong: this is a non-empty string

數組可以使用受支援的 PHP 語法:

$auth['admin'] = array('alice', 'bob');
$report_open_areas = [1, 3];

不要新增結束 ?> 標籤。它可能會引入意外輸出並破壞標頭或 cookie。

最低設定

新網站通常需要會議室/設備時區和資料庫連接:

$timezone = 'Europe/Berlin';

$dbsys = 'mysql';
$db_host = 'localhost';
$db_database = 'mrbs';
$db_login = 'mrbs';
$db_password = 'replace-this-password';
$db_tbl_prefix = 'mrbs_';
$db_persist = false;

使用會議室/設備所在的時區。它可能與伺服器時區不同。

資料庫設定

選擇資料庫

$dbsys = 'mysql'; // MySQL or MariaDB

或:

$dbsys = 'pgsql'; // PostgreSQL

連結行為

localhost可以根據驅動程式選擇Unix套接字。使用 127.0.0.1 強制 TCP MySQL。可單獨指定非標準連接埠:

$db_host = '127.0.0.1';
$db_port = 3306;

PostgreSQL 具有多個模式的安裝可以設定:

$db_schema = 'public';

表前綴必須與安裝的架構相符:

$db_tbl_prefix = 'mrbs_';

預設會停用持久連線。僅在衡量實際需求並了解它們與事務和鎖的交互作用後才啟用它們。

URL 和反向代理設定

MRBS 通常會從請求中取得其 URL。當反向代理、路徑前綴或不尋常的虛擬主機設定使其不可靠時,請從 systemdefaults.inc.php 複製相關 URL 設定並設定明確公共基礎。

外部 URL 必須使用使用者看到的方案和主機。設定代理以傳遞受信任的方案和主機訊息,並拒絕不受信任的主機標頭。

更改 URL 行為後,測試:

  • 登入後重定向;
  • 電子郵件中的連結;
  • iCalendar URL;
  • 資訊亭出口連結;
  • 多網站連結;和
  • HTTP-到-HTTPS重定向。

身分驗證和會話

身分驗證驗證身分; session 方法取得並保留它。

$auth["type"] = "db";
$auth["session"] = "php";

外部系統添加自己的設置,例如:

$auth["type"] = "ldap";
$auth["session"] = "php";

請勿將範例使用者或密碼複製到生產環境中。明確映射管理員存取權限並測試普通使用者和管理員。請參閱認證。

存取控制

$auth下的設定控制公眾可見性和特權預訂行為:

$auth['deny_public_access'] = true;
$auth['only_admin_can_book'] = false;
$auth['admin_must_obey_policies'] = true;

一起查看相關設定。公共日曆、公共報告、資訊亭和私人預訂可以公開不同的資訊。

日曆和介面

常見的全域覆蓋包括:

$default_view = 'week';
$weekstarts = 1;                 // Monday
$display_mincals = true;
$show_timeline = true;
$kiosk_mode_enabled = false;

日期和時間格式是區域設定感知的。覆蓋格式時複製完整的相關 $datetime_formats 條目,而不是部分重建它。

預訂規則

許多預訂規則都屬於一個區域並在資料庫中進行管理。全域設定可以跨區域施加限製或限制能力。

將策略覆蓋保留在一個明確標記的部分中,並記錄業務原因:

// Facilities policy: every user may hold at most 20 future bookings.
$max_per_interval_global_enabled['future'] = true;
$max_per_interval_global['future'] = 20;

在策略邊界測試定期預訂、多日預訂和管理員預訂。

電子郵件

選擇傳送方式,並設定寄件者、收件者、事件和連線:

$mail_settings['admin_backend'] = 'smtp';
$mail_settings['from'] = 'mrbs@example.org';
$mail_settings['booker'] = true;

$smtp_settings['host'] = 'mail.example.org';
$smtp_settings['port'] = 587;
$smtp_settings['auth'] = true;
$smtp_settings['secure'] = 'tls';
$smtp_settings['username'] = 'mrbs@example.org';
$smtp_settings['password'] = 'replace-this-password';

保持憑證驗證啟用。請參閱電子郵件通知。

語言和當地用語

僅當瀏覽器協商不合適時才設定固定的預設語言:

$default_language_tokens = 'de';

覆蓋單一標籤而不進行編輯web/lang/lang.*:

$vocab_override['en']['mrbs'] = 'Resource Booking';
$vocab_override['de']['mrbs'] = 'Ressourcenbuchung';
$vocab_override['fr']['mrbs'] = 'Réservation de ressources';
$vocab_override['es']['mrbs'] = 'Reserva de recursos';

使用 $vocab_override 可以在升級過程中保留本地措辭。 文字和翻譯 涵蓋了完整的工作流程。

自訂欄位

自訂資料庫列可以透過設定進行標記和調整:

$vocab_override['en']['room.coffee_machine'] = 'Coffee machine';
$select_options['entry.catering'] = array(
    'c' => 'Coffee',
    's' => 'Sandwiches',
    'h' => 'Hot lunch'
);
$is_mandatory_field['entry.catering'] = true;
$is_private_field['entry.refreshments'] = true;

必須先完成資料庫變更。 entry 自訂列需要 repeat 中的相同列。有關支援的類型、模式範例、驗證、隱私、欄位順序和測試,請參閱自訂欄位。

包含另一個文件中的機密

config.inc.php 可以包含另一個文件,但路徑必須是絕對路徑:

require '/etc/mrbs/database-secrets.php';

被包含的檔案應只傳回或指派預期值,並確保 PHP 程序可讀取。請將其放在 Web 伺服器的公開文件根目錄之外。

環境變數也可以明確讀取:

$db_password = getenv('MRBS_DB_PASSWORD');

驗證所需值是否存在,而不是默默地接受空秘密。

多網站

多網站使用全域設定以及sites/<site>/下的特定於網站的設定。至少,每個網站都需要一個獨立的表前綴:

$multisite = true;
$db_tbl_prefix = 'berlin_';

身分驗證、郵件、主題和其他設定可能因網站而異。請參閱多網站。

偵錯

僅暫時啟用調試行為,切勿將其暴露給不受信任的使用者。特定於整合的偵錯輸出可以包含目錄資料、標頭、郵件伺服器詳細資訊或個人資訊。

保持停用憑證日誌記錄:

$auth['log_credentials'] = false;

升級安全維護

對於每個 MRBS 升級:

  1. 備份活動設定。
  2. 從新版的config.inc.php-sample開始。
  3. 將舊的覆蓋與新的預設值進行比較。
  4. 僅傳輸有意設定。
  5. 刪除相容性檢查報告的過時變數。
  6. 運行語法驗證和功能測試。

避免將完整的舊預設設定複製到新設定中;這隱藏了新的預設值並使以後的升級變得困難。

驗證清單

php -l /var/www/mrbs/config.inc.php

然後驗證:

  • 幫助上的應用程式和資料庫版本;
  • 資料庫連接和表前綴;
  • 會議室/設備時區和夏令時行為;
  • 登入、登出、到期和管理員映射;
  • 公共和私人觀點;
  • 建立、編輯、刪除、重複和策略邊界;
  • 電子郵件寄件者、收件人和 TLS;
  • 使用報告、匯出、資訊亭和多網站;和
  • 沒有密碼或私人資料的日誌。

推薦的文件佈局

保持文件簡短並分組:

<?php
declare(strict_types=1);
namespace MRBS;

// Timezone
$timezone = 'Europe/Berlin';

// Database
$dbsys = 'mysql';
// ...

// Authentication
$auth['type'] = 'db';
$auth['session'] = 'php';

// Site-specific overrides
// ...

每個不明顯的覆蓋都應該解釋為什麼安裝需要它。