如何在ASP.NET Core中获取IIS重写前的RawUrl
获取IIS重写前的原始RawUrl方法
方法1:读取IIS内置服务器变量
IIS会在重写操作前将原始URL存储在特定的服务器变量中,你可以直接从请求的服务器变量集合中读取:
public static class HttpRequestExtensions { public static Uri GetRawOriginalUrl(this HttpRequest request) { var httpContext = request.HttpContext; var baseUri = new Uri($"{request.Scheme}://{request.Host}"); // 优先读取UNENCODED_URL:IIS保留的原始未编码完整路径 if (httpContext.Request.ServerVariables.TryGetValue("UNENCODED_URL", out var rawUrl)) { return new Uri(baseUri, rawUrl); } // 备选读取HTTP_X_ORIGINAL_URL:部分场景下由重写规则传递的原始URL else if (httpContext.Request.ServerVariables.TryGetValue("HTTP_X_ORIGINAL_URL", out var originalUrl)) { return new Uri(baseUri, originalUrl); } // 兜底方案:返回当前获取到的URL var requestFeature = httpContext.Features.Get<IHttpRequestFeature>(); return new Uri(requestFeature.RawTarget); } }
如果遇到变量无法读取的情况,需要在web.config的重写规则中显式允许传递该变量:
<rewrite> <rules> <rule name="YourRewriteRule" stopProcessing="true"> <match url="^drapes-equipment-covers/(\d+-\d+-\d+)/$" /> <action type="Rewrite" url="/product/?x=drapes-equipment-covers&y={R:1}" /> <!-- 添加配置确保原始URL变量被传递到应用 --> <serverVariables> <set name="HTTP_X_ORIGINAL_URL" value="{HTTP_URL}" /> </serverVariables> </rule> </rules> </rewrite>
方法2:在重写规则中显式附加原始URL
如果服务器变量读取失败,可以直接在重写规则里把原始URL作为查询参数附加到重写后的地址中,后续从查询参数提取:
修改web.config的重写规则:
<rule name="YourRewriteRule" stopProcessing="true"> <match url="^drapes-equipment-covers/(\d+-\d+-\d+)/$" /> <action type="Rewrite" url="/product/?x=drapes-equipment-covers&y={R:1}&originalUrl={HTTP_URL}" /> </rule>
然后在代码中读取:
public static Uri GetRawOriginalUrl(this HttpRequest request) { var baseUri = new Uri($"{request.Scheme}://{request.Host}"); if (request.Query.TryGetValue("originalUrl", out var originalUrl)) { return new Uri(baseUri, originalUrl.ToString()); } // 兜底方案 var requestFeature = request.HttpContext.Features.Get<IHttpRequestFeature>(); return new Uri(requestFeature.RawTarget); }
方法3:ASP.NET Core提前拦截原始请求
如果是ASP.NET Core应用,可在IIS重写中间件之前注册自定义中间件,提前捕获重写前的原始URL并存储:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 自定义中间件:在重写中间件之前执行,捕获原始URL app.Use(async (context, next) => { var rawTarget = context.Features.Get<IHttpRequestFeature>().RawTarget; context.Items["OriginalRawUrl"] = new Uri($"{context.Request.Scheme}://{context.Request.Host}{rawTarget}"); await next(); }); // 注册IIS重写中间件 app.UseRewriter(new RewriteOptions().AddIISUrlRewrite(env.ContentRootFileProvider, "web.config")); // 其他业务中间件... }
后续在需要的地方读取存储的原始URL:
public static Uri GetRawOriginalUrl(this HttpRequest request) { if (request.HttpContext.Items.TryGetValue("OriginalRawUrl", out var obj) && obj is Uri originalUrl) { return originalUrl; } // 兜底方案 var requestFeature = request.HttpContext.Features.Get<IHttpRequestFeature>(); return new Uri(requestFeature.RawTarget); }
内容的提问来源于stack exchange,提问作者Ganesh Mitra
相关产品推荐
相关产品推荐

