Node.js 如何在NodeJs/Angular应用程序Google应用程序引擎中强制SSL

Node.js 如何在NodeJs/Angular应用程序Google应用程序引擎中强制SSL,node.js,angular,google-app-engine,ssl,Node.js,Angular,Google App Engine,Ssl,我想在Google App Engine上启动一个web应用程序 它是一个带有前端和后端的NodeJs/Angular应用程序,我按照以下指南将其作为单独的服务部署:使用client.yml部署前端,使用api.yml部署后端,使用dispatch.yml将所有请求路由到/api到后端服务 我还向应用程序添加了一个自定义子域,并由谷歌管理SSL证书 现在唯一要做的就是强制使用SSL,所以当我访问时,我会自动重定向到。在谷歌创建的标准appspot域名上,一切正常 现在我尝试了很多方法来解决这个问

我想在Google App Engine上启动一个web应用程序

它是一个带有前端和后端的NodeJs/Angular应用程序,我按照以下指南将其作为单独的服务部署:使用client.yml部署前端,使用api.yml部署后端,使用dispatch.yml将所有请求路由到/api到后端服务

我还向应用程序添加了一个自定义子域,并由谷歌管理SSL证书

现在唯一要做的就是强制使用SSL,所以当我访问时,我会自动重定向到。在谷歌创建的标准appspot域名上,一切正常

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

文档说,对于标准环境,您应该使用app.yml中的
secure:always
,就像这个问题一样。它不起作用,我就是这样配置的:

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
然后,我尝试按照以下答案配置nginx-app.conf,但没有成功:

set $test "";

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

if ($test = 'http') {
    return 301 https://$host$request_uri;
}
然后我想也许我在一个灵活的环境中,即使我认为我是标准的。因此,我在文档中找到了一些关于使用头盔包的信息,并遵循以下非常详细的答案来实现它:

不幸的是,这也不起作用,现在我将感谢你的帮助


提前感谢

您的第一个
/
处理程序匹配,并且永远不会到达
安全:始终
指令。尝试:

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
处理程序:
-网址:/
静态_文件:immocheck/index.html
上传:immocheck/index.html
安全:总是

-url:/#您的第一个
/
处理程序匹配,并且永远不会到达
安全:始终
指令。尝试:

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
处理程序:
-网址:/
静态_文件:immocheck/index.html
上传:immocheck/index.html
安全:总是

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

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

你还提到:

我不知道该应用程序是以标准版还是flex版运行 环境

如果未定义
env
元素,则应用程序将部署在app Engine Standard上。您可以通过以下方式进行确认:

  • 导航菜单>应用程序引擎>版本
  • 在当前版本的“环境”选项卡下进行检查
  • 正如您正确提到的,要强制应用程序使用HTTPS,请为app.yaml中的每个处理程序指定
    secure:always
    元素

    要将自定义域的所有连接重定向到使用HTTPS,您必须先设置,然后在响应中设置。请记住,您可以在谷歌管理或使用您自己的证书之间进行选择


    我还建议您查看,并查看,以便更深入地了解如何设置您的环境和设计您的应用程序。

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

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

    你还提到:

    我不知道该应用程序是以标准版还是flex版运行 环境

    如果未定义
    env
    元素,则应用程序将部署在app Engine Standard上。您可以通过以下方式进行确认:

  • 导航菜单>应用程序引擎>版本
  • 在当前版本的“环境”选项卡下进行检查
  • 正如您正确提到的,要强制应用程序使用HTTPS,请为app.yaml中的每个处理程序指定
    secure:always
    元素

    要将自定义域的所有连接重定向到使用HTTPS,您必须先设置,然后在响应中设置。请记住,您可以在谷歌管理或使用您自己的证书之间进行选择


    我还建议您查看并查看,以便更深入地了解如何设置环境和设计应用程序。

    这解决了我的问题:

    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。

    这解决了我的问题:

    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。

    谢谢你澄清这一点。我用正则表达式实现了你的建议。在那之后,我可以像以前一样访问https,但在尝试直接导航到http时遇到了404。谢谢,谢谢你澄清这一点。我用正则表达式实现了你的建议。在那之后,我可以像以前一样访问https,但在尝试直接导航到http时遇到了404。谢谢。谢谢你让我知道如何找到我正在运行的环境。这实际上是标准的。至于运行时:我在部署该服务时遵循了这一中篇文章,它很快就工作了。我从未质疑过运行时应该是python27,因为我只提供dist文件夹中的编译文件。这应该不会是一个问题,因为应用程序部署在一个标准的env中。我应该能够配置app.yaml文件中的所有内容,不是吗?SSL cerfificates(谷歌管理)已经安装。在app.yaml中设置严格传输安全标头,如so
    Strict Transport Security:max age=31536000;includeSubDomains
    破坏了一切,导致http和https上都出现404。感谢您让我知道如何找到我正在运行的环境。这实际上是标准的。至于运行时:我在部署该服务并使其正常工作后遵循了这一中篇文章