
Ich versuche herauszufinden, wie ich mit der Whitelistung bestimmter Domänennamen umgehen kann. Wenn die Anfrage von einer bestimmten Subdomäne stammt, z. B. <id>.domain-name.com
, wird der Zugriff auf die Bilder auf eine Whitelist genehmigter Domänen beschränkt. Anfragen von Domänen, die nicht auf der Whitelist stehen, führen zu einem 403-Fehler.
Ich bin nicht sicher, was ich genau tun soll? Verwende ich map
den Kontext?
Beispielsweise würde meine nginx.conf ungefähr so aussehen
map $http_host $whitelist {
default 0;
"~^(?<id>\w+)\.domain-name\.example\.com$" $id;
# whitelist domains
whitelist1 1;
whitelist2 1;
}
server {
listen 80;
proxy_intercept_errors on;
error_page 400 = @fallback;
if ($whitelist = 0) {
return 403;
}
proxy_pass $whitelist;
}
Antwort1
Ihre nginx
Konfiguration sieht größtenteils korrekt aus, Sie können jedoch einige Änderungen vornehmen, um sicherzustellen, dass sie wie erwartet funktioniert.
Zuerst müssen Sie die eigentliche Whitelist der Domänen definieren, die auf die Bilder zugreifen dürfen. In Ihrer aktuellen Konfiguration haben Sie zwei Whitelist-Domänen als whitelist1
und definiert whitelist2
. Sie sollten diese durch die tatsächlichen Domänennamen ersetzen, die auf die Bilder zugreifen dürfen.
Zweitens haben Sie in Ihrem Map-Kontext die Variable als Wert der Subdomäne definiert, $whitelist
die die Anfrage stellt. Was Sie jedoch tatsächlich benötigen, ist der Wert des Domänennamens, der die Anfrage stellt, ohne die Subdomäne. Sie können Ihren Map-Kontext ändern, um den Domänennamen wie folgt zu extrahieren:
map $http_host $whitelist {
default 0;
"~^(?<subdomain>\w+)\.(?<domain>domain-name\.example\.com)$" $domain;
# whitelist domains
whitelist1 example.com;
whitelist2 subdomain.example.com;
}
Im obigen Beispiel erfasst der reguläre Ausdruck die Subdomäne und den Domänennamen getrennt. Die Variable $domain
wird dann auf den Wert des Domänennamens ohne die Subdomäne gesetzt.
Schließlich können Sie die $whitelist
Variable in Ihrem Serverblock verwenden, um zu bestimmen, ob der Zugriff auf die Bilder erlaubt oder verweigert werden soll. Ihre aktualisierte Konfiguration würde folgendermaßen aussehen:
map $http_host $whitelist {
default 0;
"~^(?<subdomain>\w+)\.(?<domain>domain-name\.example\.com)$" $domain;
# whitelist domains
whitelist1 example.com;
whitelist2 subdomain.example.com;
}
server {
listen 80;
proxy_intercept_errors on;
error_page 400 = @fallback;
if ($whitelist = 0) {
return 403;
}
location /images {
# allow access only to whitelisted domains
allow $whitelist;
deny all;
# serve images from disk
alias /path/to/images;
}
location @fallback {
# handle errors
return 400;
}
}