Reactjs Spring boot未将url路径转发到index.html包
我使用springboot为restapi部署了一个JAR。该应用程序还通过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 {
/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中工作?运行匿名模式?