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

如何在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&amp;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&amp;y={R:1}&amp;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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 13:06:16