Reactjs Spring boot未将url路径转发到index.html包

Reactjs Spring boot未将url路径转发到index.html包,reactjs,spring,spring-boot,ubuntu,progressive-web-apps,Reactjs,Spring,Spring Boot,Ubuntu,Progressive Web Apps,我使用springboot为restapi部署了一个JAR。该应用程序还通过/static目录为React web应用程序包提供服务 问题是,当我尝试输入此链接时: 我看到的是映射的白标错误页面404消息,而不是预期页面 这个问题不会发生在我的本地环境中,只是在生产环境中(Ubuntu 16 vps) 以下是我的WebMvcConfig类的代码: @Configuration public class WebMvcConfig implements WebMvcConfigurer {

我使用springboot为restapi部署了一个JAR。该应用程序还通过
/static
目录为React web应用程序包提供服务

问题是,当我尝试输入此链接时:

我看到的是映射的
白标错误页面404
消息,而不是预期页面

这个问题不会发生在我的本地环境中,只是在生产环境中(Ubuntu 16 vps)

以下是我的WebMvcConfig类的代码:

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    private final long MAX_AGE_SECS = 3600;

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("HEAD", "OPTIONS", "GET", "POST", "PUT", "PATCH", "DELETE")
                .maxAge(MAX_AGE_SECS);
    }

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/{spring:\\w+}")
                .setViewName("forward:/");
        registry.addViewController("/**/{spring:\\w+}")
                .setViewName("forward:/");
        registry.addViewController("/{spring:\\w+}/**{spring:?!(\\.js|\\.css)$}")
                .setViewName("forward:/");
    }

}
POM.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>XXX</groupId>
    <artifactId>XXX</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>XXX</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- For Working with Json Web Tokens (JWT) -->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.0</version>
        </dependency>
        <!-- For Java 8 Date/Time Support -->
        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jsr310</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
            <version>2.0.1.RELEASE</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <executable>true</executable>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

4.0.0
org.springframework.boot
spring启动程序父级
2.1.2.1发布
XXX
XXX
0.0.1-快照
XXX
SpringBoot的演示项目
1.8
org.springframework.boot
spring引导启动器数据jpa
org.springframework.boot
弹簧启动安全
org.springframework.boot
SpringBootStarterWeb
mysql
mysql连接器java
运行时
org.springframework.boot
弹簧起动试验
测试
org.springframework.security
弹簧安全性试验
测试
io.jsonwebtoken
jjwt
0.9.0
com.fasterxml.jackson.datatype
jackson-datatype-jsr310
org.springframework.boot
春季启动邮件
2.0.1.1发布
org.springframework.boot
springbootmaven插件
真的
下面是路由的javascript代码:

export const routes = (
  <Switch>
    <PrivateRoute exact path="/" component={Routines} />
    <PrivateRoute exact path="/home" component={Routines} />
    <Route exact path="/login" component={Login} />
    <Route exact path="/signup" component={Signup} />
    <PrivateRoute exact path="/password/change" component={ChangePassword} />
    <Route exact path="/password/change/:token" component={ChangePassword} />
    <Route exact path="/password/reset" component={ResetPassword} />
    <Route component={NotFoundPage} />
  </Switch>
);
导出常量路由=(
);
通过React路由或在浏览器中插入URL,所有其他路由都可以正常工作


即使在生产环境中,如何将所有路由转发到index.html?

问题在于
WebMvcConfig
类中
regex
es的
addViewControllers
方法

特别是,
\\w
只匹配字母和数字,但不匹配连字符。出于一个奇怪的原因,可能是因为浏览器缓存,它在dev环境中工作

下面是正确的
regex
^[a-zA-Z\d-"]
和下面正确的
addViewControllers
方法:

@Override
public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("/{spring:^[a-zA-Z\\d-_]+}")
            .setViewName("forward:/");
    registry.addViewController("/**/{spring:^[a-zA-Z\\d-_]+}")
            .setViewName("forward:/");
    registry.addViewController("/{spring:^[a-zA-Z\\d-_]+}/**{spring:?!(\\.js|\\.css)$}")
            .setViewName("forward:/");
}

您是否可以尝试从
中删除
精确的
?我会尝试,但我不明白为什么@ThomasAndolfExact用于匹配一件事情时会出现问题。它只能匹配
/password/change
我猜没有任何输入值,而且那里没有任何公共路由,因此可能会滑到后端。当我在开发环境中测试它时
react router
很好地映射了这两种情况下的路由。我想这可能是Spring的东西,但我不确定为什么它只在浏览器中的dev.caching中工作?运行匿名模式?