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开发能力,适合有特殊验证需求的场景。
测试验证
配置完成后,你可以做两个测试:
- 直接在浏览器地址栏输入图片URL(比如
domain.com/img/img.jpg),应该返回403禁止访问; - 在你自己网站的页面中用
<img src="/img/img.jpg">引用图片,图片应该能正常显示。
内容的提问来源于stack exchange,提问作者Matthew Stott
相关产品推荐
相关产品推荐

