This PR fixes concurrent Nginx updates using stale config data.
It reloads the config after locking and safely handles nested locks and included files.
This PR adds a "Redirect all requests" option to the server block and location URL Re-Writing pages in the Nginx Webserver module, backed by the Nginx return directive with a choice of 301, 302, 303, 307 or 308.
The existing rewrite table only offers the redirect and permanent flags, which map to 302 and 301. The other codes requested on the forum are not supported by rewrite at all, so they can only be provided through return.
The new option only manages return directives that are redirects. A bare URL form such as return https://example.com/; is shown as a 302, while non-redirect uses like return 404; are hidden from the page and never modified or removed.
Example of the resulting config for a server block:
return 308 "https://example.com$request_uri";
Fixes https://forum.virtualmin.com/t/137940
ⓘ Values with a # were written unquoted, so on the next read the module took the # as the start of a comment and lost the rest of the line.
For example, a redirect saved as return 301 https://example.com/docs#install; then showed as no redirect on the page, and re-saving it added a duplicate rewrite_log directive that Nginx rejected.
So, before the fix, saving a redirect to https://example.com/docs#install wrote:
return 301 https://example.com/docs#install;
rewrite_log off;
On the next read the module dropped everything after the #, so it saw one merged line:
return 301 https://example.com/docs rewrite_log off;
The redirect disappeared from the page, and saving again appended a second rewrite_log off;, which Nginx rejects as a duplicate.
After the fix the same save writes:
return 301 "https://example.com/docs#install";
rewrite_log off;
Nginx treats the quoted and unquoted forms identically, and the module reads it back correctly.
Every module now has a reviewed desc_tr and longdesc_tr in
module.info.tr - 245 strings across 125 modules. Previously 37 were
reviewed, 194 came from module.info.tr.auto and 14 were missing
entirely (grub2, hardware-info, kea-dhcp, logviewer, nftables, systemd,
xterm), so those modules showed English titles in the Webmin menu.
The reviewed strings are removed from module.info.tr.auto, which now
holds only name_tr - the same split the de and ca translations use.
Thirty-six of those files became empty and are deleted.
Some of the machine text this replaces was wrong rather than just
clumsy:
sarg "Squid Report Generator" had become "Kalamar Rapor
Oluşturucu" - the fish, not the proxy
heartbeat the product name was translated as "Kalp Atışı"
cluster-cron "Cron Jobs" had become "Cron İş İlanları" (job ads)
proc "renice" was translated as "rename"
samba "file and print shares" was split into "create a samba
file" and "print the shares"
exports, hpuxexports, sgiexports, inetd, init, mount, net
each repeated the file path mid-sentence
firewall, the "(iptables)" and "(ip6tables)" qualifiers that
firewall6 distinguish the two modules were dropped
Turkish capitalisation of English words was also wrong throughout
("İptables", "İnetd", "İscsitarget", "İnternet"), and three previously
reviewed strings were stored as double-encoded UTF-8 (cron/desc_tr,
mailboxes/desc_tr, mailboxes/longdesc_tr).
cluster-cron and ldap-server carried a stray desc_de_tr key - a German
key that had leaked into the Turkish file. It is removed.
Translates all 410 strings in nginx/lang/en into Turkish and removes
nginx/lang/tr.auto.
Configuration keywords and sample values are left in English, including
directive names, size suffixes (4k, 1M, 32k), the cipher list example
HIGH:!aNULL:!MD5, index.php, text/plain and the hostname:port format
hint.
ⓘ The password file path was taken from the request without any check, so it could point at any file on the system, which was then read or written.
It is now checked against the allowed directories, the same way it already is when the path is first set.
W1 and V4