跨域资源共享(Cross-Origin Resource Sharing)是现代浏览器支持的安全机制,Nginx可以通过以下方式配置:
server {
listen 80;
server_name example.com;
location / {
# 允许所有域名跨域访问
add_header 'Access-Control-Allow-Origin' '*';
# 允许的请求方法
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';
# 预检请求(OPTIONS)的缓存时间
add_header 'Access-Control-Max-Age' 1728000;
# 允许浏览器在跨域请求中携带凭证(cookie等)
# add_header 'Access-Control-Allow-Credentials' 'true';
# 处理OPTIONS请求
if ($request_method = 'OPTIONS') {
return 204;
}
# 其他配置...
}
}
map $http_origin $cors_origin {
default "";
"~^https://example\.com$" $http_origin;
"~^https://sub\.example\.com$" $http_origin;
}
server {
# ...其他配置
location / {
if ($cors_origin) {
add_header 'Access-Control-Allow-Origin' $cors_origin;
add_header 'Access-Control-Allow-Credentials' 'true';
}
# 其他配置...
}
}
防盗链可以防止其他网站直接链接你的资源(如图片、视频等),消耗你的带宽。
server {
listen 80;
server_name example.com;
location ~* \.(jpg|jpeg|png|gif|ico|css|js|pdf)$ {
# 允许空Referer(直接访问或本地文件)
valid_referers none blocked;
# 允许自己的域名
valid_referers server_names example.com *.example.com;
# 如果Referer不合法,返回403或重定向
if ($invalid_referer) {
return 403;
# 或者重定向到一张"禁止盗链"的图片
# rewrite ^ /anti-hotlinking.jpg;
}
}
}
server {
# ...其他配置
location ~* \.(jpg|jpeg|png|gif|ico|css|js|pdf)$ {
# 允许空Referer和特定域名
valid_referers none blocked
example.com
*.example.com
api.example.com
trusted-site.com;
if ($invalid_referer) {
# 可以记录盗链尝试
access_log /var/log/nginx/hotlink.log;
return 403;
}
# 添加过期头,利用浏览器缓存
expires 30d;
}
}
map $http_origin $cors_origin {
default "";
"~^https://example\.com$" $http_origin;
"~^https://sub\.example\.com$" $http_origin;
}
server {
listen 80;
server_name example.com;
location ~* \.(jpg|jpeg|png|gif|ico|css|js|pdf)$ {
# 防盗链配置
valid_referers none blocked server_names example.com *.example.com;
if ($invalid_referer) {
return 403;
}
# 跨域配置
if ($cors_origin) {
add_header 'Access-Control-Allow-Origin' $cors_origin;
add_header 'Access-Control-Allow-Methods' 'GET';
add_header 'Access-Control-Allow-Credentials' 'true';
}
# 缓存控制
expires 30d;
add_header Cache-Control "public";
}
}
跨域配置:
Access-Control-Allow-Origin: *
不能与 Access-Control-Allow-Credentials: true
同时使用防盗链配置:
性能考虑:
根据实际需求调整上述配置,测试时可以使用curl命令或浏览器开发者工具验证配置是否生效。