Skip to content

跨域配置与防盗链

跨域配置

跨域资源共享(CORS)允许浏览器向不同域名的服务器发起请求。Nginx 可以通过设置 HTTP 响应头来实现 CORS 支持,配置示例:

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';

        # 预检请求缓存时间
        add_header 'Access-Control-Max-Age' 1728000;

        # 允许携带凭证(如 Cookie)
        add_header 'Access-Control-Allow-Credentials' 'true';

        # 处理 OPTIONS 预检请求
        if ($request_method = 'OPTIONS') {
            return 204;
        }

        # 其他代理配置
        proxy_pass http://backend;
    }
}

关键配置项

  • Access-Control-Allow-Origin:允许访问的域名,* 表示允许所有域名。
  • Access-Control-Allow-Methods:允许的 HTTP 方法(如 GET、POST)。
  • Access-Control-Allow-Headers:允许的请求头。
  • Access-Control-Max-Age:预检请求的缓存时间(秒)。
  • Access-Control-Allow-Credentials:是否允许携带凭证(如 Cookie)。

注意事项

  • 如果允许特定域名访问,可以将 * 替换为具体的域名,例如:

    nginx
    add_header 'Access-Control-Allow-Origin' 'https://example.com';

    如果需要支持带凭证的请求(如 Cookie),Access-Control-Allow-Origin 不能为 *,必须指定具体域名。


防盗链配置

防盗链(Hotlink Protection)用于防止其他网站直接引用你的资源(如图片、视频),从而减少带宽消耗和资源滥用。

nginx
server {
    listen 80;
    server_name example.com;

    location ~* \.(jpg|jpeg|png|gif|mp4)$ {
        # 允许空 Referer(直接访问)和本站域名访问
        valid_referers none blocked example.com *.example.com;

        # 如果 Referer 不合法,返回 403 或重定向到其他图片
        if ($invalid_referer) {
            return 403;
            # 或者重定向到一张提示图片
            # rewrite ^/.*$ /anti-hotlink.jpg break;
        }

        # 其他代理配置
        proxy_pass http://backend;
    }
}

关键配置项

  • valid_referers:定义合法的 Referer 来源:
    • none:允许空 Referer(直接访问)。
    • blocked:允许没有协议头(如 http://https://)的 Referer。
    • example.com:允许指定域名访问。
    • *.example.com:允许子域名访问。
  • $invalid_referer:如果 Referer 不合法,返回 403 或重定向。
  • 防盗链配置通常用于静态资源(如图片、视频)。