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
相关产品推荐
相关产品推荐

