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

ASP.NET MVC中MapController的HTTP转HTTPS重定向失效问题

解决ASP.NET MVC中指定前缀HTTP请求重定向到HTTPS的问题

问题分析

你的现有代码仅在访问MapPage Action(对应http://nvmbd1bkh150v02.rjil.ril.com/FiberInventorylease/)时生效,是因为重定向逻辑只写在单个Action方法内,那些带../..的路径请求并未触发这个方法。要实现所有符合前缀规则的HTTP请求都重定向到HTTPS,需要将重定向逻辑扩展到所有目标请求上,自定义Action过滤器是更合适的方案。

解决方案

1. 自定义HTTPS重定向过滤器

创建一个继承自ActionFilterAttribute的过滤器,统一处理重定向逻辑,确保所有匹配主机和路径前缀的请求都被处理:

using System;
using System.Web.Mvc;

public class RedirectToHttpsAttribute : ActionFilterAttribute
{
    // 目标主机和路径前缀,可根据实际情况调整
    private readonly string _targetHost = "nvmbd1bkh150v02.rjil.ril.com";
    private readonly string _targetPathPrefix = "/FiberInventorylease/";

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var request = filterContext.HttpContext.Request;

        // 仅处理非本地、非HTTPS且匹配目标规则的请求
        if (!request.IsLocal && !request.IsSecureConnection)
        {
            bool isHostMatch = request.Url.Host.Equals(_targetHost, StringComparison.OrdinalIgnoreCase);
            bool isPathMatch = request.Url.AbsolutePath.StartsWith(_targetPathPrefix, StringComparison.OrdinalIgnoreCase);

            if (isHostMatch && isPathMatch)
            {
                // 使用UriBuilder构造完整HTTPS地址,自动保留路径、查询参数等
                var uriBuilder = new UriBuilder(request.Url)
                {
                    Scheme = Uri.UriSchemeHttps,
                    Port = 443 // 若HTTPS使用非默认端口,替换为对应端口号
                };

                // 执行重定向,终止后续请求处理
                filterContext.Result = new RedirectResult(uriBuilder.Uri.ToString(), false);
                filterContext.HttpContext.ApplicationInstance.CompleteRequest();
            }
        }

        base.OnActionExecuting(filterContext);
    }
}

2. 应用过滤器

你可以选择两种方式应用这个过滤器:

方式一:控制器级别(仅对MapController下的所有Action生效)

在MapController上添加过滤器标记:

[RedirectToHttps]
public class MapController : Controller
{
    public ActionResult MapPage()
    {
        // 原业务逻辑代码
        return View();
    }

    // 控制器内其他Action也会自动触发重定向逻辑
}
方式二:全局级别(对整个项目所有请求生效)

在FilterConfig中注册全局过滤器(通常位于App_Start目录下):

using System.Web.Mvc;

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new RedirectToHttpsAttribute());
        // 其他全局过滤器(如HandleErrorAttribute)
    }
}

关键改进点

  • 覆盖范围更广:过滤器会拦截所有符合规则的请求,不再局限于单个Action。
  • Url构造更可靠:使用UriBuilder替代字符串替换,能正确处理端口、查询参数、特殊字符等场景,避免替换错误。
  • 规则匹配更精准:通过主机和路径前缀的双重校验,确保仅处理目标域名下的指定路径请求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 12:43:12