首页 > 解决方案 > 如何在 f# 中使用 suave 从 http 重定向到 https

问题描述

如何使用 Suave 将连接从 http 重定向到 https?

https://gist.github.com/ademar/f4ddb788162dbdd9e104574e2accf07f我发现了这个:

let redirectToSsl : WebPart =
      context(fun c ->
       match c.request.header "x-forwarded-proto" with
        | Choice1Of2 "http" ->
              let uriBuilder = new UriBuilder(
                                      Scheme = Uri.UriSchemeHttps,
                                      Path = c.request.path,
                                      Host = c.request.host)
              Redirection.redirect (uriBuilder.Uri.ToString())
        | _ -> fun _ ->async { return None })

但我不确定这将适合管道中的哪个位置?

标签: f#suave

解决方案


我会改变两件事:

  • 检查实际协议。我认为这x-forwarded-proto仅用于代理,但我不确定。
  • 要将其安装到您的管道中,请在访问安全时接受要调用的 Web 部件。

结果如下所示:

let redirectToSsl allow : WebPart =
    context (fun c ->
        if c.request.binding.scheme.secure then
            allow
        else
            let uriBuilder =
                new UriBuilder(
                    Scheme = Uri.UriSchemeHttps,
                    Path = c.request.path,
                    Host = c.request.host)
            Redirection.redirect (uriBuilder.Uri.ToString()))

用法如下所示:

let app = redirectToSsl Files.browseHome   // allow browsing under SSL only

警告:我没有在实践中尝试过这个,所以我可能会忽略其他问题。


推荐阅读