【问题标题】:How to force SSL in NodeJs/Angular App Google App Engine如何在 NodeJs/Angular App Google App Engine 中强制 SSL
【发布时间】:2021-01-10 22:34:16
【问题描述】:

我想在 Google App Engine 上启动一个网络应用程序。

它是一个带有前端和后端的 NodeJs/Angular 应用程序,我按照本指南将其部署为单独的服务:https://medium.com/@rgoyard/how-to-deploy-a-single-page-application-and-its-backend-to-google-app-engine-353ff93bd38c 使用 client.yml 部署前端,api.yml 用于后端,dispatch.yml 用于路由所有请求到 /api 到后端服务。

我还在应用中添加了一个自定义子域,并让 SSL 证书由 google 管理。

现在唯一要做的就是强制 SSL,所以当我访问 http://subdomain.domain.com 时,我会自动重定向到 https://subdomain.domain.de。在谷歌创建的标准 apppot 域上一切正常。

现在我尝试了很多方法来解决这个问题,我不知道应用程序是在标准环境还是弹性环境中运行,所以尝试了我找到的所有方法。

文档说对于标准环境,您应该在 app.yml 中使用 secure: always,就像在这个问题 Google App Engine - Redirect HTTP to HTTPS 中一样。它不起作用,这就是我的配置方式:

runtime: python27
api_version: 1
threadsafe: true
service: default
handlers:
  - url: /
    static_files: immocheck/index.html
    upload: immocheck/index.html
  - url: /
    static_dir: immocheck
  - url: /.*
    secure: always
    redirect_http_response_code: 301
    script: auto

然后我尝试按照这个答案 https://stackoverflow.com/a/49370832/14021965 配置 nginx-app.conf 但它没有用:

set $test "";

if ($http_x_forwarded_proto = 'http') {
    set $test "http";
}

if ($test = 'http') {
    return 301 https://$host$request_uri;
}

然后我想也许我在一个灵活的环境中,即使我认为我是标准的。所以我在文档中发现了一些关于使用头盔包的信息,并按照这个非常详细的答案来实现它:https://stackoverflow.com/a/51689825/14021965

很遗憾,这也不起作用,现在我很感谢您的帮助。

提前致谢

【问题讨论】:

    标签: node.js angular google-app-engine ssl


    【解决方案1】:

    您的第一个 / 处理程序匹配,并且永远不会到达 secure: always 指令。试试:

    handlers:
      - url: /
        static_files: immocheck/index.html
        upload: immocheck/index.html
        secure: always
    
      - url: /  # <-- this url will never get hit, as it already matched above, so try this:
    
      - url: /(.*\.(html|gif|png|jpg|js|css))$
        static_files: immocheck/\1
        upload: immocheck/.*\.(html|gif|png|jpg|js|css)$
        secure: always
    
      - url: /.*
        redirect_http_response_code: 301
        script: auto   
        secure: always
    

    【讨论】:

    • 感谢您澄清这一点。我用正则表达式实现了你的建议。之后我可以像以前一样访问 https,但尝试直接导航到 http 时出现 404。
    • 当我用正则表达式省略部分时,它起作用了。谢谢。
    【解决方案2】:

    这解决了我的问题:

    runtime: python27
    api_version: 1
    threadsafe: true
    service: default
    
    handlers:
      - url: /
        static_files: immocheck/index.html
        upload: immocheck/index.html
        secure: always
        redirect_http_response_code: 301
      - url: /
        secure: always
        redirect_http_response_code: 301
        static_dir: immocheck
    

    感谢@GAEfan 让我上路。

    【讨论】:

      【解决方案3】:

      您提到您编写了一个 NodeJS/Angular 应用程序,但从 yaml 文件中我看到该应用程序使用 Python 2.7。为了定义正确的运行时,请将您的 runtime 元素更改为:

      runtime: nodejs12
      

      Here您可以找到有关 yaml 配置文件及其元素的所有必要信息。

      您还提到:

      我不知道应用是在标准版还是弹性版中运行 环境。

      如果您未定义 env 元素,则应用会部署在 App Engine 标准上。您可以通过以下方式确认:

      1. 导航菜单 > App Engine > 版本
      2. 在当前版本的“环境”标签下查看。

      正如您正确提到的,要为您的应用强制使用 HTTPS,请在您的 app.yaml 中为 each 处理程序指定 secure: always 元素。 Reference

      要将自定义域的所有连接重定向到使用 HTTPS,您必须设置 SSL certificates,然后在响应中设置 Strict-Transport-Security header。请注意,您可以在 Google 托管或使用您自己的证书之间进行选择。

      我还建议您查看Node.js Quickstart for App Engine Standard,并查看How-to-Guides,以便更深入地了解如何设置您的环境和设计您的应用程序。

      【讨论】:

      • 感谢您让我知道如何找出我正在运行的环境。它实际上是标准的。至于运行时:我按照这个 Medium Post medium.com/@karthiksagar/… 部署了该服务,它立即工作。我从不质疑运行时应该是 python27,因为我只提供 dist 文件夹中的编译文件。这应该不是问题,因为应用程序部署在标准环境中,我应该能够配置 app.yaml 文件中的所有内容,不是吗?
      • SSL 证书(由 Google 管理)已安装。像这样在 app.yaml 中设置 Strict-Transport-Security 标头 Strict-Transport-Security: max-age=31536000; includeSubDomains 破坏了一切,导致 http 和 https 上的 404。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-21
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 2017-01-02
      • 2017-08-28
      • 1970-01-01
      相关资源
      最近更新 更多