You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

IIS服务器设置:允许HTML显示图片但禁止直接URL访问

实现IIS图片仅允许网页内嵌展示、禁止直接访问的方法

当然可以实现这个需求!核心思路是验证图片请求的来源——只有当请求来自你自己网站的页面(也就是通过HTML <img> 标签触发的请求)时,才允许访问图片;直接输入URL访问的请求则直接拒绝。下面是两种最实用的实现方案:

方法一:使用IIS URL重写模块(推荐,无需编码)

这是最便捷的方案,只要你的IIS服务器安装了URL重写模块,通过配置web.config就能搞定:

步骤1:确认URL重写模块已安装

打开IIS管理器,查看左侧“功能视图”里有没有“URL重写”选项。如果没有,需要通过服务器管理器的“添加角色和功能”,在Web服务器的“应用程序开发”里勾选“URL重写”进行安装。

步骤2:添加重写规则

在你的站点根目录下的web.config文件中,添加以下配置(记得替换成你自己的域名):

<configuration>
  <system.webServer>
    <rewrite>
      <rules>
        <rule name="Block direct image access" stopProcessing="true">
          <!-- 匹配img目录下的所有常见图片格式 -->
          <match url="^img/.*\.(jpg|jpeg|png|gif|bmp|webp)$" />
          <conditions logicalGrouping="MatchAny">
            <!-- 条件1:请求没有Referer(直接输入URL访问的情况) -->
            <add input="{HTTP_REFERER}" pattern="^$" />
            <!-- 条件2:Referer不是来自你的域名(第三方网站盗图或者伪造的情况) -->
            <add input="{HTTP_REFERER}" pattern="^https?://(www\.)?yourdomain\.com/.*$" negate="true" />
          </conditions>
          <!-- 满足条件时返回403禁止访问 -->
          <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Direct access to images is not allowed" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

关键配置说明

  • match url:指定要保护的图片目录和格式,这里是img目录下的常见图片格式,你可以根据自己的目录结构调整。
  • conditions:用MatchAny表示只要满足任意一个条件就触发规则:
    • 直接输入URL访问时,HTTP Referer头是空的,会触发第一个条件;
    • 如果是第三方网站引用你的图片,Referer会是对方的域名,不匹配你的域名,触发第二个条件。
  • action:返回403状态码,告诉浏览器访问被禁止。

注意事项

  • 把yourdomain.com替换成你实际的域名,如果有多个子域名,可以把pattern改成^https?://(.*\.)?yourdomain\.com/.*$,匹配所有子域名。
  • 这种方法不是绝对安全(Referer头可以被伪造),但能覆盖绝大多数普通场景,阻止直接访问和大部分盗图行为。
  • 如果需要允许特定第三方域名引用你的图片,可以在conditions里添加一条反向规则,比如<add input="{HTTP_REFERER}" pattern="^https?://trusted-site\.com/.*$" negate="true" />,这样来自trusted-site.com的请求就不会被拦截。

方法二:自定义HTTP模块(适合复杂场景)

如果需要更严格的验证逻辑(比如结合用户登录状态、Cookie验证等),可以编写自定义HTTP模块来处理请求:

核心思路

创建一个实现IHttpModule接口的.NET类,在BeginRequest事件中检查请求路径是否为图片,然后验证请求来源(比如Referer、Cookie等),不符合条件就返回403。

示例代码(C#)

public class ImageAccessModule : IHttpModule
{
    public void Init(HttpApplication context)
    {
        context.BeginRequest += OnBeginRequest;
    }

    private void OnBeginRequest(object sender, EventArgs e)
    {
        HttpApplication app = (HttpApplication)sender;
        HttpRequest request = app.Context.Request;
        HttpResponse response = app.Context.Response;

        // 检查请求是否是图片文件
        string[] allowedExtensions = { ".jpg", ".jpeg", ".png", ".gif" };
        string ext = Path.GetExtension(request.Url.AbsolutePath).ToLower();
        if (allowedExtensions.Contains(ext) && request.Url.AbsolutePath.StartsWith("/img/"))
        {
            // 验证Referer是否来自自己的域名
            string referer = request.UrlReferrer?.ToString();
            if (string.IsNullOrEmpty(referer) || !referer.StartsWith("https://yourdomain.com/"))
            {
                response.StatusCode = 403;
                response.StatusDescription = "Direct access not allowed";
                response.End();
            }
        }
    }

    public void Dispose() { }
}

然后在web.config中注册这个模块:

<configuration>
  <system.webServer>
    <modules>
      <add name="ImageAccessModule" type="YourNamespace.ImageAccessModule" />
    </modules>
  </system.webServer>
</configuration>

这种方法灵活性更高,但需要你具备.NET开发能力,适合有特殊验证需求的场景。

测试验证

配置完成后,你可以做两个测试:

  1. 直接在浏览器地址栏输入图片URL(比如domain.com/img/img.jpg),应该返回403禁止访问;
  2. 在你自己网站的页面中用<img src="/img/img.jpg">引用图片,图片应该能正常显示。

内容的提问来源于stack exchange,提问作者Matthew Stott

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:17:13