插件窝 干货文章 Nginx跨域访问和防盗链如何配置

Nginx跨域访问和防盗链如何配置

配置 Origin Control example 384    来源:    2025-04-26

Nginx跨域访问与防盗链配置指南

跨域访问配置(CORS)

跨域资源共享(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';
        }

        # 其他配置...
    }
}

防盗链配置(Referer)

防盗链可以防止其他网站直接链接你的资源(如图片、视频等),消耗你的带宽。

基础防盗链配置

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";
    }
}

注意事项

  1. 跨域配置

    • Access-Control-Allow-Origin: * 不能与 Access-Control-Allow-Credentials: true 同时使用
    • 对于复杂请求(如Content-Type不是application/x-www-form-urlencoded, multipart/form-data或text/plain),需要处理OPTIONS预检请求
  2. 防盗链配置

    • Referer可以被伪造,不能完全依赖
    • 某些浏览器隐私模式或插件可能会不发送Referer
    • 考虑结合签名URL或token验证实现更安全的防盗链
  3. 性能考虑

    • 过多的正则匹配可能影响性能
    • 对于静态资源,考虑使用CDN并配置相应的跨域和防盗链规则

根据实际需求调整上述配置,测试时可以使用curl命令或浏览器开发者工具验证配置是否生效。