惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Jina AI
Jina AI
N
Netflix TechBlog - Medium
P
Proofpoint News Feed
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
D
DataBreaches.Net
人人都是产品经理
人人都是产品经理
aimingoo的专栏
aimingoo的专栏
Stack Overflow Blog
Stack Overflow Blog
Blog — PlanetScale
Blog — PlanetScale
月光博客
月光博客
阮一峰的网络日志
阮一峰的网络日志
I
InfoQ
F
Fortinet All Blogs
J
Java Code Geeks
Last Week in AI
Last Week in AI
美团技术团队
大猫的无限游戏
大猫的无限游戏
有赞技术团队
有赞技术团队
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园_首页
量子位
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Apple Machine Learning Research
Apple Machine Learning Research
小众软件
小众软件

博客园 - 不是豆豆

【AI】Docker Buildx 多架构构建配置 切换 Google Play 国家地区 NuGet 命令行记录 在 UnionTech OS Server 20 Euler 64bit 上安装 docker 环境 在 Windows 7 SP1 或 Windows Server 2008 R2 SP1 系统中安装 ASP.NET Core 10.0 运行时环境 记录各版本 Microsoft Visual C++ Redistributable 官方下载地址 在 PolarDB-PG 上安装 pgvector 扩展 在 microsoft onnxruntime 中使用 arcface model 出错:Invalid input scale: NumDimensions() != 3 在 Windows 下为 PostgreSQL 安装 pgvector 插件 如果两个 Steam 库文件夹中,有相同的两份游戏,这时删除第二份会怎样? 当 linux 主机内存较小运行程序(如 yum update)被 Killed 迁移 Gitea 从 Windows 到 Linux Docker 容器中(使用 SQLite 数据库) 在 EF Core 中使用传统的 DbFirst 模式 在 SkiaSharp 中对图片进行缩放时,结果锯齿较多的处理方案 在 asp.net core web 项目中,创建项目时因选择容器化部署,未配置 IIS Express 应如何进行修改 如何重置 sftpgo 的管理员密码 微信鸿蒙版 8.0.14 查询 navigator.maxTouchPoints 为 0 导致的 bug 在本地 claude code 中使用 copilot pro 订阅 在安装 miniforge3(conda)环境后,每次启动终端(PowerShell)都非常缓慢的处理方案 在 .net framework 4.8 下,若因为安装或升级了 System.ValueTuple 出现问题 在 Windows 11 系统下,日常使用浏览器(Edge、Chrome)常遇到画面撕裂或浏览器在经切换窗口后显示内容不正常 关于 CVE-2025-55315 漏洞问题查验记录 在 gitea 服务器端查询 lfs 文件占用情况 编写 GKD 规则 在 Windows 下 .net 项目中,使用 ViGEm 模拟游戏手柄 为传统 .net framework 项目切换 nlog 日志 处理过大的 docker 日志 测试支持 PolarDB-X(高度兼容 MySQL) 的客户端图形工具 SteamDeck 重置系统密码教程 新版本 portainer ce 在操作容器时,报错 Forbidden - origin invalid
在 https 反向代理后的 IIS 站点,配置 IIS 重定向会导致 htt...
不是豆豆 · 2026-07-27 · via 博客园 - 不是豆豆

问题

在 IIS 中配置 HTTP 重定向,destination 明明写的是相对路径:

<system.webServer>
    <httpRedirect enabled="true" exactDestination="true" httpResponseStatus="Found" destination="/test/login/#/sso$Q" />
</system.webServer>

但实际返回的 Location 响应头还是从 http:// 开始的完整地址:

Location: http://主机名/test/login/#/sso?ticket=abc123

在反向代理、内外网映射等场景下,这可能会导致 https 地址被降级为 http,进而导致地址不能访问或者还需要多一次重定向。

原因

IIS 的 HTTP 重定向模块(httpRedirect)在生成 302 响应时,会自动用当前请求的协议和 Host 头把目标补全成绝对地址,没有任何开关可以关掉。exactDestination 只控制是否把原请求路径追加到目标后面,与绝对/相对无关。

URL Rewrite 模块的入站 Redirect 动作也是同样的行为,即使 url 写相对路径,最终也会自动补全主机名(微软确认的设计行为)。

解决方案

用 URL Rewrite 的出站规则(outboundRules)改写 RESPONSE_Location。出站规则是在响应发出前对响应头做纯文本正则替换,不走 URL 补全逻辑,所以可以把协议和主机名剥掉,# 和查询串都能原样保留:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <httpRedirect enabled="true" exactDestination="true" httpResponseStatus="Found" destination="/test/login/#/sso$Q" />
        <rewrite>
            <outboundRules>
                <rule name="LocationToRelative">
                    <match serverVariable="RESPONSE_Location" pattern="^https?://[^/]+(/.*)" />
                    <action type="Rewrite" value="{R:1}" />
                </rule>
            </outboundRules>
        </rewrite>
    </system.webServer>
</configuration>

实测效果(curl -I http://localhost:8099/some/old/path?ticket=abc123):

# 加规则前
Location: http://localhost:8099/test/login/#/sso?ticket=abc123

# 加规则后
Location: /test/login/#/sso?ticket=abc123

注意:完整版 IIS 默认不带 URL Rewrite 模块,需要单独安装:https://www.iis.net/downloads/microsoft/url-rewrite (IIS Express 自带)。

这个出站规则对任何来源的重定向响应都生效(包括后端应用自己发出的 302),所以它也是反向代理场景下修正 Location 头的通用做法。

参考: