Nginx可以通过多种方式实现基于请求来源域名的访问控制,以下是几种常见的方法:
$http_referer
变量进行控制server {
listen 80;
server_name example.com;
location / {
# 只允许来自trusted.com的请求
if ($http_referer !~* ^https?://(www\.)?trusted\.com/) {
return 403;
}
# 其他配置
}
}
$http_origin
变量(适用于CORS请求)server {
listen 80;
server_name example.com;
location / {
# 设置允许的源域名
set $cors "";
if ($http_origin ~* (https?://(www\.)?(allowed1.com|allowed2.com))) {
set $cors $http_origin;
}
# 如果来源不在允许列表中,返回403
if ($cors = "") {
return 403;
}
# 设置CORS头
add_header 'Access-Control-Allow-Origin' "$cors";
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
# 其他配置
}
}
http {
geoip_country /usr/share/GeoIP/GeoIP.dat;
server {
listen 80;
server_name example.com;
location / {
# 只允许来自特定国家的访问
if ($geoip_country_code != "US") {
return 403;
}
# 其他配置
}
}
}
http {
map $http_referer $allowed_referer {
default 0;
"~*^https?://(www\.)?trusted1.com/" 1;
"~*^https?://(www\.)?trusted2.com/" 1;
}
server {
listen 80;
server_name example.com;
location / {
if ($allowed_referer = 0) {
return 403;
}
# 其他配置
}
}
}
server {
listen 80;
server_name example.com;
location / {
access_by_lua_block {
local referer = ngx.var.http_referer
local allowed = false
-- 检查白名单
local whitelist = {
"trusted1.com",
"trusted2.com"
}
if referer then
for _, domain in ipairs(whitelist) do
if string.find(referer, domain) then
allowed = true
break
end
end
end
if not allowed then
ngx.exit(ngx.HTTP_FORBIDDEN)
end
}
# 其他配置
}
}
$http_referer
可以被伪造,不能完全依赖它进行安全控制以上方法可以根据实际需求组合使用,实现更灵活的访问控制策略。