This commit is contained in:
Mateusz Gruszczyński committed 2026-10-21 09:38:21 +02:00
1 parent 3776edf4fc
commit 7cfc3a6da1
35 files changed
+1377 -875

No files matched your search

+264 -197
View File
@@ -1922,7 +1922,7 @@
</div>
<p class="fine" data-i18n="refreshHelp">Per-account refresh intervals. Off pauses
all automatic sources; manual refresh remains available.</p>
<div class="appearance-settings-grid">
<div class="appearance-settings-grid refresh-settings-grid">
<label class="check"><input type="checkbox" checked id="refresh-live-enabled"
data-refresh-preference="live_enabled" />
<span data-i18n="refreshLiveEnabled">Automatic refresh
@@ -2920,19 +2920,6 @@
id="runtime-system-memory">-</code></div>
<div><span class="small-label" data-i18n="systemUptime">System uptime</span><code
id="runtime-system-uptime">-</code></div>
</div>
<h3 data-i18n="systemProcessHeading">RustProxy process</h3>
<div class="runtime-information-grid">
<div><span class="small-label" data-i18n="systemAppVersion">RustProxy
version</span><code id="runtime-version">-</code></div>
<div><span class="small-label" data-i18n="systemProcessUptime">Process
uptime</span><code id="runtime-process-uptime">-</code></div>
<div><span class="small-label" data-i18n="systemProcessMemory">Process RAM
(RSS)</span><code id="runtime-process-memory">-</code></div>
<div><span class="small-label" data-i18n="systemProcessThreads">Process
threads</span><code id="runtime-process-threads">-</code></div>
<div><span class="small-label" data-i18n="systemOpenFds">Open file
descriptors</span><code id="runtime-open-fds">-</code></div>
<div><span class="small-label" data-i18n="statisticsSource">Statistics
source</span><code id="runtime-statistics-source">-</code></div>
</div>
@@ -3550,11 +3537,13 @@
<div class="vh-field"><span class="small-label" data-i18n="webServicePresetAction">Preset
action</span><button class="outline" data-i18n="webServicePresetApply"
id="web-service-preset-apply" type="button">Apply preset</button></div>
<label class="check"><input id="web-service-hardening-attacks" type="checkbox" /><span
data-i18n="webServiceHardeningAttacks">Block common attack probes</span></label>
<label class="check"><input id="web-service-hardening-headers" type="checkbox" /><span
data-i18n="webServiceHardeningHeaders">Strip unnecessary fingerprint
headers</span></label>
<div class="vh-wide web-service-preset-toggles">
<label class="check"><input id="web-service-hardening-attacks" type="checkbox" /><span
data-i18n="webServiceHardeningAttacks">Block common attack probes</span></label>
<label class="check"><input id="web-service-hardening-headers" type="checkbox" /><span
data-i18n="webServiceHardeningHeaders">Strip unnecessary fingerprint
headers</span></label>
</div>
<p class="fine vh-wide" data-i18n="webServicePresetHelp" id="web-service-preset-summary">
Presets fill normal Web Service settings and remain fully editable. Document root,
service ID/name and PHP-FPM endpoint are not replaced.</p>
@@ -3629,167 +3618,235 @@
responses are never stored.</p>
</div>
<div class="vh-grid web-service-page" data-web-service-page="delivery" hidden>
<label class="vh-wide"><span data-i18n="webServiceSendfile">Linux sendfile (zero-copy)</span>
<select id="web-service-sendfile">
<option value="off" data-i18n="notEnabled">Disabled</option>
<option value="auto" data-i18n="webServiceSendfileAuto">Auto (eligible plain HTTP/1.1)
</option>
</select><small class="fine" data-i18n="webServiceSendfileHelp">Opt-in for static GET files at
least 64 KiB on Linux HTTP/1.1 without TLS, cache, compression or transform. Other requests
use safe streaming; switching this setting never clears the cache.</small></label>
<label><span data-i18n="webServiceCompression">Dynamic compression</span><select
id="web-service-compression">
<option value="" data-i18n="inherit">Inherit</option>
<option value="on" data-i18n="enabled">Enabled</option>
<option value="off" data-i18n="notEnabled">Disabled</option>
</select><small class="fine" data-i18n="webServiceCompressionHelp">Inherits the vhost/global
policy by default. Codecs can be filtered per service; globally disabled codecs stay
unavailable.</small></label>
<div class="vh-wide vh-grid" id="web-service-compression-options">
<label><span data-i18n="compressionZstd">Zstandard (zstd)</span><select
id="web-service-compression-zstd">
<option value="" data-i18n="inherit">Inherit</option>
<option value="on" data-i18n="enabled">Enabled</option>
<option value="off" data-i18n="notEnabled">Disabled</option>
</select></label>
<label><span data-i18n="compressionBr">Brotli (br)</span><select
id="web-service-compression-br">
<option value="" data-i18n="inherit">Inherit</option>
<option value="on" data-i18n="enabled">Enabled</option>
<option value="off" data-i18n="notEnabled">Disabled</option>
</select></label>
<label><span data-i18n="compressionGzip">gzip</span><select id="web-service-compression-gzip">
<option value="" data-i18n="inherit">Inherit</option>
<option value="on" data-i18n="enabled">Enabled</option>
<option value="off" data-i18n="notEnabled">Disabled</option>
</select></label>
<label><span data-i18n="compressionDeflate">deflate</span><select
id="web-service-compression-deflate">
<option value="" data-i18n="inherit">Inherit</option>
<option value="on" data-i18n="enabled">Enabled</option>
<option value="off" data-i18n="notEnabled">Disabled</option>
</select></label>
</div>
<label class="check"><input id="web-service-precompressed" type="checkbox" /><span
data-i18n="webServicePrecompressed">Serve precompressed sidecars</span></label>
<label class="check"><input id="web-service-precompressed-br" type="checkbox" /><span
data-i18n="webServicePrecompressedBr">Brotli (.br)</span></label>
<label class="check"><input id="web-service-precompressed-gzip" type="checkbox" /><span
data-i18n="webServicePrecompressedGzip">Gzip (.gz)</span></label>
<label class="vh-wide"><span data-i18n="webServiceDownloadExtensions">Download
extensions</span><textarea id="web-service-download-extensions" maxlength="4096" rows="5"
spellcheck="false" placeholder="zip&#10;pdf&#10;tar"></textarea><small class="fine"
data-i18n="webServiceDownloadExtensionsHelp">Files with these extensions receive
Content-Disposition: attachment.</small></label>
<p class="fine vh-wide" data-i18n="webServiceRangeHelp">Static and precompressed representations
keep validators, single-range requests, 206/416 and streaming delivery.</p>
<section class="vh-wide vh-setting-section web-service-setting-section">
<h3 data-i18n="webServiceStaticDeliverySection">Static file delivery</h3>
<div class="vh-grid">
<label class="vh-wide"><span data-i18n="webServiceSendfile">Linux sendfile
(zero-copy)</span>
<select id="web-service-sendfile">
<option value="off" data-i18n="notEnabled">Disabled</option>
<option value="auto" data-i18n="webServiceSendfileAuto">Auto (eligible plain
HTTP/1.1)
</option>
</select><small class="fine" data-i18n="webServiceSendfileHelp">Opt-in for static GET
files at
least 64 KiB on Linux HTTP/1.1 without TLS, cache, compression or transform. Other
requests
use safe streaming; switching this setting never clears the cache.</small></label>
<label class="vh-wide"><span data-i18n="webServiceDownloadExtensions">Download
extensions</span><textarea id="web-service-download-extensions" maxlength="4096"
rows="5" spellcheck="false" placeholder="zip&#10;pdf&#10;tar"></textarea><small
class="fine" data-i18n="webServiceDownloadExtensionsHelp">Files with these
extensions receive
Content-Disposition: attachment.</small></label>
<p class="fine vh-wide" data-i18n="webServiceRangeHelp">Static and precompressed
representations
keep validators, single-range requests, 206/416 and streaming delivery.</p>
</div>
</section>
<section class="vh-wide vh-setting-section web-service-setting-section">
<h3 data-i18n="webServiceDynamicCompressionSection">Dynamic compression</h3>
<div class="vh-grid">
<label><span data-i18n="webServiceCompression">Dynamic compression</span><select
id="web-service-compression">
<option value="" data-i18n="inherit">Inherit</option>
<option value="on" data-i18n="enabled">Enabled</option>
<option value="off" data-i18n="notEnabled">Disabled</option>
</select><small class="fine" data-i18n="webServiceCompressionHelp">Inherits the
vhost/global
policy by default. Codecs can be filtered per service; globally disabled codecs stay
unavailable.</small></label>
<div class="vh-wide vh-grid" id="web-service-compression-options">
<label><span data-i18n="compressionZstd">Zstandard (zstd)</span><select
id="web-service-compression-zstd">
<option value="" data-i18n="inherit">Inherit</option>
<option value="on" data-i18n="enabled">Enabled</option>
<option value="off" data-i18n="notEnabled">Disabled</option>
</select></label>
<label><span data-i18n="compressionBr">Brotli (br)</span><select
id="web-service-compression-br">
<option value="" data-i18n="inherit">Inherit</option>
<option value="on" data-i18n="enabled">Enabled</option>
<option value="off" data-i18n="notEnabled">Disabled</option>
</select></label>
<label><span data-i18n="compressionGzip">gzip</span><select
id="web-service-compression-gzip">
<option value="" data-i18n="inherit">Inherit</option>
<option value="on" data-i18n="enabled">Enabled</option>
<option value="off" data-i18n="notEnabled">Disabled</option>
</select></label>
<label><span data-i18n="compressionDeflate">deflate</span><select
id="web-service-compression-deflate">
<option value="" data-i18n="inherit">Inherit</option>
<option value="on" data-i18n="enabled">Enabled</option>
<option value="off" data-i18n="notEnabled">Disabled</option>
</select></label>
</div>
</div>
</section>
<section class="vh-wide vh-setting-section web-service-setting-section">
<h3 data-i18n="webServiceSidecarsSection">Precompressed assets</h3>
<div class="vh-grid">
<label class="check"><input id="web-service-precompressed" type="checkbox" /><span
data-i18n="webServicePrecompressed">Serve precompressed sidecars</span></label>
<label class="check"><input id="web-service-precompressed-br" type="checkbox" /><span
data-i18n="webServicePrecompressedBr">Brotli (.br)</span></label>
<label class="check"><input id="web-service-precompressed-gzip" type="checkbox" /><span
data-i18n="webServicePrecompressedGzip">Gzip (.gz)</span></label>
</div>
</section>
</div>
<div class="vh-grid web-service-page" data-web-service-page="php" hidden>
<label class="vh-wide"><span data-i18n="phpProfileSelect">PHP-FPM configuration source</span>
<select id="web-service-php-profile">
<option value="" data-i18n="phpProfileLocal">Local configuration</option>
</select>
<small class="fine" data-i18n="phpProfileHelp">Select a shared profile or edit PHP-FPM locally.
Profile changes apply to all attached Web Services.</small>
</label>
<div class="vh-wide"><button type="button" class="outline" id="web-service-php-profiles"
data-i18n="phpProfileManage">Manage PHP-FPM profiles</button></div>
<div class="vh-wide php-switch-row"><label class="check php-switch-label"><input
id="web-service-php-enabled" type="checkbox" /><span
data-i18n="webServicePhpEnabled">Enable PHP-FPM / FastCGI</span></label>
<details class="metric-info php-field-info">
<summary data-i18n-aria="phpHintEnabled" aria-label="About enabling PHP-FPM">i</summary>
<div class="metric-info-popover">
<p class="fine" data-i18n="phpHintEnabled">Enables execution of configured PHP
extensions via the PHP-FPM socket. The pool must already be running; RustProxy does
not start PHP. Other files remain static.</p>
<section class="vh-wide vh-setting-section web-service-setting-section">
<h3 data-i18n="webServicePhpSourceSection">PHP-FPM source and endpoint</h3>
<div class="vh-grid">
<label class="vh-wide"><span data-i18n="phpProfileSelect">PHP-FPM configuration
source</span>
<select id="web-service-php-profile">
<option value="" data-i18n="phpProfileLocal">Local configuration</option>
</select>
<small class="fine" data-i18n="phpProfileHelp">Select a shared profile or edit PHP-FPM
locally.
Profile changes apply to all attached Web Services.</small>
</label>
<div class="vh-wide"><button type="button" class="outline" id="web-service-php-profiles"
data-i18n="phpProfileManage">Manage PHP-FPM profiles</button></div>
<div class="vh-wide php-switch-row"><label class="check php-switch-label"><input
id="web-service-php-enabled" type="checkbox" /><span
data-i18n="webServicePhpEnabled">Enable PHP-FPM / FastCGI</span></label>
<details class="metric-info php-field-info">
<summary data-i18n-aria="phpHintEnabled" aria-label="About enabling PHP-FPM">i
</summary>
<div class="metric-info-popover">
<p class="fine" data-i18n="phpHintEnabled">Enables execution of configured PHP
extensions via the PHP-FPM socket. The pool must already be running;
RustProxy does
not start PHP. Other files remain static.</p>
</div>
</details>
</div>
</details>
</div>
<label class="vh-wide"><span data-i18n="webServicePhpEndpoint">PHP-FPM endpoint</span><input
id="web-service-php-endpoint" maxlength="512"
placeholder="unix:/run/php/php-fpm.sock" /><small class="fine"
data-i18n="webServicePhpEndpointHelp">Unix: unix:/run/php/php-fpm.sock. TCP:
tcp:127.0.0.1:9000 or tcp:[::1]:9000. TCP is intentionally limited to loopback
addresses.</small></label>
<label><span data-i18n="webServicePhpExtensions">PHP extensions</span><input
id="web-service-php-extensions" maxlength="512" placeholder="php, phtml" /><small
class="fine" data-i18n="phpHintExtensions">Comma-separated extensions without dots (e.g.
php, phtml). Only listed types are executed as PHP.</small></label>
<div class="vh-wide php-switch-row"><label class="check php-switch-label"><input
id="web-service-php-pass-authorization" type="checkbox" /><span
data-i18n="webServicePhpPassAuthorization">Forward Authorization header</span></label>
<details class="metric-info php-field-info">
<summary data-i18n-aria="phpHintPassAuthorization"
aria-label="Authorization forwarding information">i</summary>
<div class="metric-info-popover">
<p class="fine" data-i18n="phpHintPassAuthorization">Passes the incoming Authorization
header to PHP as HTTP_AUTHORIZATION. Enable for API/Bearer/Basic authentication;
disable if the application does not need it.</p>
<label class="vh-wide"><span data-i18n="webServicePhpEndpoint">PHP-FPM endpoint</span><input
id="web-service-php-endpoint" maxlength="512"
placeholder="unix:/run/php/php-fpm.sock" /><small class="fine"
data-i18n="webServicePhpEndpointHelp">Unix: unix:/run/php/php-fpm.sock. TCP:
tcp:127.0.0.1:9000 or tcp:[::1]:9000. TCP is intentionally limited to loopback
addresses.</small></label>
<label><span data-i18n="webServicePhpExtensions">PHP extensions</span><input
id="web-service-php-extensions" maxlength="512" placeholder="php, phtml" /><small
class="fine" data-i18n="phpHintExtensions">Comma-separated extensions without dots
(e.g.
php, phtml). Only listed types are executed as PHP.</small></label>
</div>
</section>
<section class="vh-wide vh-setting-section web-service-setting-section">
<h3 data-i18n="webServicePhpRequestSection">Request handling</h3>
<div class="vh-grid">
<div class="vh-wide php-switch-row"><label class="check php-switch-label"><input
id="web-service-php-pass-authorization" type="checkbox" /><span
data-i18n="webServicePhpPassAuthorization">Forward Authorization
header</span></label>
<details class="metric-info php-field-info">
<summary data-i18n-aria="phpHintPassAuthorization"
aria-label="Authorization forwarding information">i</summary>
<div class="metric-info-popover">
<p class="fine" data-i18n="phpHintPassAuthorization">Passes the incoming
Authorization
header to PHP as HTTP_AUTHORIZATION. Enable for API/Bearer/Basic
authentication;
disable if the application does not need it.</p>
</div>
</details>
</div>
</details>
</div>
<div class="vh-wide php-switch-row"><label class="check php-switch-label"><input
id="web-service-php-path-info" type="checkbox" /><span
data-i18n="webServicePhpPathInfo">Enable PHP PATH_INFO splitting</span></label>
<details class="metric-info php-field-info">
<summary data-i18n-aria="phpHintPathInfo" aria-label="PHP PATH_INFO information">i</summary>
<div class="metric-info-popover">
<p class="fine" data-i18n="phpHintPathInfo">Allows /static.php/skins/file.css to run the
existing static.php script with PATH_INFO=/skins/file.css. Needed by Roundcube
static.php routes; usually not required for WordPress. Off by default.</p>
<div class="vh-wide php-switch-row"><label class="check php-switch-label"><input
id="web-service-php-path-info" type="checkbox" /><span
data-i18n="webServicePhpPathInfo">Enable PHP PATH_INFO splitting</span></label>
<details class="metric-info php-field-info">
<summary data-i18n-aria="phpHintPathInfo" aria-label="PHP PATH_INFO information">i
</summary>
<div class="metric-info-popover">
<p class="fine" data-i18n="phpHintPathInfo">Allows /static.php/skins/file.css to
run the
existing static.php script with PATH_INFO=/skins/file.css. Needed by
Roundcube
static.php routes; usually not required for WordPress. Off by default.</p>
</div>
</details>
</div>
</details>
</div>
<label><span data-i18n="webServicePhpConnectTimeout">Connect timeout (ms)</span><input
id="web-service-php-connect-timeout" min="50" max="60000" step="1" type="number" /><small
class="fine" data-i18n="phpHintConnectTimeout">How long to wait for the FPM socket
connection; e.g. 1000 = 1 s (50–60000).</small></label>
<label><span data-i18n="webServicePhpRequestTimeout">Total FastCGI request timeout (ms)</span><input
id="web-service-php-request-timeout" min="100" max="3600000" step="1" type="number" /><small
class="fine" data-i18n="phpHintRequestTimeout">Time for the complete FastCGI exchange; e.g.
30000 = 30 s (100–3600000).</small></label>
<label><span data-i18n="webServicePhpConcurrency">Max concurrent PHP requests</span><input
id="web-service-php-concurrency" min="1" max="4096" step="1" type="number" /><small
class="fine" data-i18n="phpHintConcurrency">Max simultaneous PHP requests for this service;
e.g. 64. Exhaustion returns 503 (1–4096).</small></label>
<label><span data-i18n="webServicePhpBodyLimit">PHP request body limit (bytes, 0 =
unlimited)</span><input id="web-service-php-body-limit" min="0" max="8589934592" step="1"
type="number" /><small class="fine" data-i18n="phpHintBodyLimit">Bytes, not MB: 67108864 =
64 MiB; 0 = no proxy-side limit. PHP post_max_size is separate.</small></label>
<label><span data-i18n="webServicePhpHeaderLimit">Max FastCGI response header bytes</span><input
id="web-service-php-header-limit" min="4096" max="1048576" step="1" type="number" /><small
class="fine" data-i18n="phpHintHeaderLimit">Max PHP response-header size in bytes; default
65536 = 64 KiB (4096–1048576).</small></label>
<label><span data-i18n="webServicePhpStderrLimit">Max PHP-FPM stderr log bytes</span><input
id="web-service-php-stderr-limit" min="0" max="65536" step="1" type="number" /><small
class="fine" data-i18n="phpHintStderrLimit">Max FastCGI STDERR bytes kept per request; e.g.
4096. 0 disables capture.</small></label>
<label class="vh-wide"><span data-i18n="webServicePhpCustomParams">Custom FastCGI
parameters</span><textarea id="web-service-php-custom-params" maxlength="65536" rows="6"
spellcheck="false" placeholder="APP_ENV = production&#10;APP_DEBUG = 0"></textarea><small
class="fine" data-i18n="webServicePhpCustomParamsHelp">One NAME = value entry per line.
Static trusted values only; core CGI, HTTP_* and PHP_* control names are
reserved. Example: APP_ENV = production; no variable interpolation.</small></label>
<label class="vh-wide"><span data-i18n="webServicePhpValues">PHP INI overrides
(PHP_VALUE)</span><textarea id="web-service-php-values" maxlength="65536" rows="6"
spellcheck="false"
placeholder="memory_limit = 256M&#10;upload_max_filesize = 64M&#10;post_max_size = 64M"></textarea><small
class="fine" data-i18n="webServicePhpValuesHelp">One php.ini directive = value per line.
Examples: memory_limit = 256M, upload_max_filesize = 64M, post_max_size = 64M,
max_execution_time = 30. Use PHP_ADMIN_VALUE for operator-only settings.</small></label>
<label class="vh-wide"><span data-i18n="phpProfileAdminValues">PHP administrator INI overrides
(PHP_ADMIN_VALUE)</span><textarea id="web-service-php-admin-values" maxlength="65536"
rows="6" spellcheck="false"
placeholder="open_basedir = /var/www/webmail/:/tmp/&#10;display_errors = Off"></textarea><small
class="fine" data-i18n="phpHintAdminValues">Admin-only directives, e.g. open_basedir =
/var/www/webmail/:/tmp/. For isolation use a dedicated PHP-FPM pool/socket; dynamic INI
overrides can persist across requests sharing a worker.</small></label>
<div class="vh-wide form-actions"><button class="outline" data-i18n="webServicePhpDocsButton"
id="web-service-php-help" type="button">FastCGI syntax and safety</button></div>
<p class="fine vh-wide" data-i18n="webServicePhpHelp">RustProxy speaks FastCGI directly to a
long-running PHP-FPM pool. PHP is not spawned per request and PHP source is never served when
PHP handling is selected.</p>
</div>
</section>
<section class="vh-wide vh-setting-section web-service-setting-section">
<h3 data-i18n="webServicePhpLimitsSection">Timeouts and capacity</h3>
<div class="vh-grid">
<label><span data-i18n="webServicePhpConnectTimeout">Connect timeout (ms)</span><input
id="web-service-php-connect-timeout" min="50" max="60000" step="1"
type="number" /><small class="fine" data-i18n="phpHintConnectTimeout">How long to
wait for the FPM socket
connection; e.g. 1000 = 1 s (50–60000).</small></label>
<label><span data-i18n="webServicePhpRequestTimeout">Total FastCGI request timeout
(ms)</span><input id="web-service-php-request-timeout" min="100" max="3600000"
step="1" type="number" /><small class="fine" data-i18n="phpHintRequestTimeout">Time
for the complete FastCGI exchange; e.g.
30000 = 30 s (100–3600000).</small></label>
<label><span data-i18n="webServicePhpConcurrency">Max concurrent PHP requests</span><input
id="web-service-php-concurrency" min="1" max="4096" step="1" type="number" /><small
class="fine" data-i18n="phpHintConcurrency">Max simultaneous PHP requests for this
service;
e.g. 64. Exhaustion returns 503 (1–4096).</small></label>
<label><span data-i18n="webServicePhpBodyLimit">PHP request body limit (bytes, 0 =
unlimited)</span><input id="web-service-php-body-limit" min="0" max="8589934592"
step="1" type="number" /><small class="fine" data-i18n="phpHintBodyLimit">Bytes, not
MB: 67108864 =
64 MiB; 0 = no proxy-side limit. PHP post_max_size is separate.</small></label>
<label><span data-i18n="webServicePhpHeaderLimit">Max FastCGI response header
bytes</span><input id="web-service-php-header-limit" min="4096" max="1048576"
step="1" type="number" /><small class="fine" data-i18n="phpHintHeaderLimit">Max PHP
response-header size in bytes; default
65536 = 64 KiB (4096–1048576).</small></label>
<label><span data-i18n="webServicePhpStderrLimit">Max PHP-FPM stderr log bytes</span><input
id="web-service-php-stderr-limit" min="0" max="65536" step="1"
type="number" /><small class="fine" data-i18n="phpHintStderrLimit">Max FastCGI
STDERR bytes kept per request; e.g.
4096. 0 disables capture.</small></label>
</div>
</section>
<section class="vh-wide vh-setting-section web-service-setting-section">
<h3 data-i18n="webServicePhpOverridesSection">FastCGI and php.ini overrides</h3>
<div class="vh-grid">
<label class="vh-wide"><span data-i18n="webServicePhpCustomParams">Custom FastCGI
parameters</span><textarea id="web-service-php-custom-params" maxlength="65536"
rows="6" spellcheck="false"
placeholder="APP_ENV = production&#10;APP_DEBUG = 0"></textarea><small class="fine"
data-i18n="webServicePhpCustomParamsHelp">One NAME = value entry per line.
Static trusted values only; core CGI, HTTP_* and PHP_* control names are
reserved. Example: APP_ENV = production; no variable interpolation.</small></label>
<label class="vh-wide"><span data-i18n="webServicePhpValues">PHP INI overrides
(PHP_VALUE)</span><textarea id="web-service-php-values" maxlength="65536" rows="6"
spellcheck="false"
placeholder="memory_limit = 256M&#10;upload_max_filesize = 64M&#10;post_max_size = 64M"></textarea><small
class="fine" data-i18n="webServicePhpValuesHelp">One php.ini directive = value per
line.
Examples: memory_limit = 256M, upload_max_filesize = 64M, post_max_size = 64M,
max_execution_time = 30. Use PHP_ADMIN_VALUE for operator-only
settings.</small></label>
<label class="vh-wide"><span data-i18n="phpProfileAdminValues">PHP administrator INI
overrides
(PHP_ADMIN_VALUE)</span><textarea id="web-service-php-admin-values"
maxlength="65536" rows="6" spellcheck="false"
placeholder="open_basedir = /var/www/webmail/:/tmp/&#10;display_errors = Off"></textarea><small
class="fine" data-i18n="phpHintAdminValues">Admin-only directives, e.g. open_basedir
=
/var/www/webmail/:/tmp/. For isolation use a dedicated PHP-FPM pool/socket; dynamic
INI
overrides can persist across requests sharing a worker.</small></label>
<div class="vh-wide form-actions"><button class="outline"
data-i18n="webServicePhpDocsButton" id="web-service-php-help" type="button">FastCGI
syntax and safety</button></div>
<p class="fine vh-wide" data-i18n="webServicePhpHelp">RustProxy speaks FastCGI directly to a
long-running PHP-FPM pool. PHP is not spawned per request and PHP source is never served
when
PHP handling is selected.</p>
</div>
</section>
</div>
<div class="vh-grid web-service-page" data-web-service-page="security" hidden>
<label><span data-i18n="webServiceSymlinkPolicy">Symlink policy</span><select
@@ -3978,23 +4035,28 @@ log_errors = On</code></pre>
id="redirect-editing">NEW</span><button class="quiet" data-i18n="close" id="redirect-close"
type="button">Close</button>
</div>
<div class="vh-grid">
<label><span data-i18n="redirectId">Redirect ID</span><input id="redirect-id" maxlength="64"
pattern="[A-Za-z0-9_-]{1,64}" required="" /></label>
<label><span data-i18n="redirectName">Display name</span><input id="redirect-name"
maxlength="96" /></label>
<label class="check"><input id="redirect-enabled" type="checkbox" /><span
data-i18n="enabled">Enabled</span></label>
<div class="vh-wide" id="redirect-hosts-editor"></div>
<label><span data-i18n="vhCertificate">Certificate</span><select
id="redirect-certificate"></select></label>
</div>
<fieldset class="vh-group editor-identity-section">
<legend data-i18n="hostIdentitySection">Host and domains</legend>
<div class="vh-grid">
<label><span data-i18n="redirectId">Redirect ID</span><input id="redirect-id" maxlength="64"
pattern="[A-Za-z0-9_-]{1,64}" required="" /></label>
<label><span data-i18n="redirectName">Display name</span><input id="redirect-name"
maxlength="96" /></label>
<label class="check"><input id="redirect-enabled" type="checkbox" /><span
data-i18n="enabled">Enabled</span></label>
<div class="vh-wide" id="redirect-hosts-editor"></div>
</div>
</fieldset>
<section class="vh-group">
<div class="card-heading">
<div><span class="small-label" data-i18n="redirectFrontend">FRONTEND</span>
<h3 data-i18n="redirectListeners">Listeners</h3>
</div>
</div>
<div class="vh-grid editor-frontend-certificate">
<label><span data-i18n="vhCertificate">Certificate</span><select
id="redirect-certificate"></select></label>
</div>
<div class="redirect-listeners" id="redirect-listeners"></div>
<div class="protocol-toggle-row"><label class="check"><input id="redirect-http2" type="checkbox" /><span
data-i18n="vhHttp2Enabled">Enable HTTP/2 for this host</span></label><label
@@ -4027,23 +4089,28 @@ log_errors = On</code></pre>
id="notfound-editing">NEW</span><button class="quiet" data-i18n="close" id="notfound-close"
type="button">Close</button>
</div>
<div class="vh-grid">
<label><span data-i18n="notfoundId">Host ID</span><input id="notfound-id" maxlength="64"
pattern="[A-Za-z0-9_-]{1,64}" required="" /></label>
<label><span data-i18n="notfoundName">Display name</span><input id="notfound-name"
maxlength="96" /></label>
<label class="check"><input id="notfound-enabled" type="checkbox" /><span
data-i18n="enabled">Enabled</span></label>
<div class="vh-wide" id="notfound-hosts-editor"></div>
<label><span data-i18n="vhCertificate">Certificate</span><select
id="notfound-certificate"></select></label>
</div>
<fieldset class="vh-group editor-identity-section">
<legend data-i18n="hostIdentitySection">Host and domains</legend>
<div class="vh-grid">
<label><span data-i18n="notfoundId">Host ID</span><input id="notfound-id" maxlength="64"
pattern="[A-Za-z0-9_-]{1,64}" required="" /></label>
<label><span data-i18n="notfoundName">Display name</span><input id="notfound-name"
maxlength="96" /></label>
<label class="check"><input id="notfound-enabled" type="checkbox" /><span
data-i18n="enabled">Enabled</span></label>
<div class="vh-wide" id="notfound-hosts-editor"></div>
</div>
</fieldset>
<section class="vh-group">
<div class="card-heading">
<div><span class="small-label" data-i18n="notfoundFrontend">FRONTEND</span>
<h3 data-i18n="redirectListeners">Listeners</h3>
</div>
</div>
<div class="vh-grid editor-frontend-certificate">
<label><span data-i18n="vhCertificate">Certificate</span><select
id="notfound-certificate"></select></label>
</div>
<div id="notfound-listeners"></div>
<div class="protocol-toggle-row"><label class="check"><input id="notfound-http2" type="checkbox" /><span
data-i18n="vhHttp2Enabled">Enable HTTP/2 for this host</span></label><label