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

F#中使用Suave实现HTTP重定向到HTTPS及管道挂载方法

Suave 框架HTTP重定向到HTTPS配置说明

你找到的redirectToSsl自定义WebPart逻辑是正确的,它会基于反向代理传递的x-forwarded-proto请求头判断原请求协议,HTTP协议请求会被重定向到同路径的HTTPS地址,其他情况直接跳过执行后续管道逻辑。

代码放置位置

该WebPart必须放在整个请求处理管道的最开头,优先级高于所有路由匹配、静态资源服务、业务逻辑处理的WebPart,确保所有请求进入业务逻辑前先完成协议校验和重定向。

完整配置示例

以下是可直接运行的完整管道配置参考:

let redirectToSsl : WebPart =
  context(fun c ->
    match c.request.header "x-forwarded-proto" with
    | Choice1Of2 "http" ->
        let uriBuilder = UriBuilder(
          Scheme = Uri.UriSchemeHttps,
          Path = c.request.path,
          Host = c.request.host
        )
        // 用永久重定向更利于SEO,临时重定向可以用redirect方法
        Redirection.redirectPermanent (uriBuilder.Uri.ToString())
    | _ -> fun _ -> async { return None })

// 无反向代理、Suave直接监听公网端口的场景,可以用下面版本的redirectToSsl
(*
let redirectToSsl : WebPart =
  context(fun c ->
    if not c.request.isSecure then
      let uriBuilder = UriBuilder(
        Scheme = Uri.UriSchemeHttps,
        Path = c.request.path,
        Host = c.request.host,
        Port = 443
      )
      Redirection.redirectPermanent uriBuilder.Uri.ToString()
    else
      fun _ -> async { return None })
*)

// 总请求处理管道
let app =
  choose [
    redirectToSsl // 放在第一个位置优先执行
    // 下方添加你自己的业务逻辑、路由配置
    path "/" >=> OK "服务运行中"
    path "/api/info" >=> OK "接口返回内容"
    Files.browseHome
    RequestErrors.NOT_FOUND "页面不存在"
  ]

// 启动服务
startWebServer defaultConfig app

注意事项

  • 如果使用Nginx、Cloudflare等反向代理,需要确保反向代理侧配置了x-forwarded-proto请求头的透传,否则重定向逻辑会失效。
  • 如果HTTPS使用非标准端口,可以在UriBuilder构造时显式指定Port参数值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 05:15:03