启用推送状态和上下文路径路由:在服务器上找不到静态资产

Fun*_*abe 3 routes cloud-foundry pushstate swisscomdev

我使用静态构建包将 React 应用程序部署到 Cloud Foundry。目标是使应用程序可以在domain.com/路径下访问。所以我根据他的博客文章配置了路线: https: //www.cloudfoundry.org/context-path-routing/

另外,我pushstate: enabled在静态文件中进行了设置,并将上下文路径添加到静态资源 URLS 中;例如,样式表的 URL 是domain.com/path/static/style.css。当我访问domain.com/path 时,我得到了index.html 文件。但是,找不到 index.html 文件中链接的静态资源,而是找到了索引文件。如果在服务器上找不到资源,这是推送状态路由的默认行为。

在此输入图像描述

为了pushstate: enabled在“子目录”中运行应用程序,我还需要配置什么吗?

Dan*_*usa 7

当您使用 启用推送状态时pushstate: enabled,构建包为您的应用程序组装的 Nginx 配置将大致如下所示。我还突出显示了专门为解决推送状态而添加的部分。

server {
    listen 8080;
    server_name localhost;

    root /home/vcap/app/public;

    location / {
        # <-- this bit here is what's added for push state support
        if (!-e $request_filename) {
          rewrite ^(.*)$ / break;
        }
        #  -->

        index index.html index.htm Default.htm;

    }
}
Run Code Online (Sandbox Code Playgroud)

您可以在此处查看构建包中启用此功能的代码。

我认为简短的答案是,buildpack 假设您用完了根目录而不是子目录,这就是当您使用 Cloud Foundry 的基于路径的路由时会发生的情况。

要解决此问题,您只需手动启用相同或相似的 Nginx 配置即可。为此,我建议采取以下措施:

  1. 启用自定义位置配置。请参阅该链接中具有该名称的表中的列并按照这些说明进行操作。这给了我以下内容Staticfile

    root: public
    location_include: includes/*.conf
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,这要求所有静态文件都位于名为public(或任何您想要命名的文件根文件夹)的文件夹下。使用时必须这样做location_include

  2. 添加自定义包含文件nginx/conf/includes/push_state.conf并在文件内添加以下内容。

    location /path/ {
    
        if (!-e $request_filename) {
          rewrite ^(.*)$ /path/ break;
        }
    
        index index.html index.htm Default.htm;
    
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 推送您的应用程序。它应该使用添加到构建包使用的基本 Nginx 配置中的自定义代码进行部署和运行。

希望有帮助!