项目用的是react-router v4 HashRouter,
在开发环境下,使用浏览器的刷新可以正常刷,
可是部署后,点击浏览器的刷新就会偶尔跳回首页,
代码中并没有跳回首页的设置,否则开发环境下也会跳的啊。
看了下response,在正常刷新留在当前页的时候返回的是304 not modified,刷新跳回首页的时候是200 OK,为什么只是不停刷新,也会一会儿返回200,一会返回304呢?
有大神遇到这种问题么,开发环境没问题,一部署就有问题头大
项目用的是react-router v4 HashRouter,
在开发环境下,使用浏览器的刷新可以正常刷,
可是部署后,点击浏览器的刷新就会偶尔跳回首页,
代码中并没有跳回首页的设置,否则开发环境下也会跳的啊。
看了下response,在正常刷新留在当前页的时候返回的是304 not modified,刷新跳回首页的时候是200 OK,为什么只是不停刷新,也会一会儿返回200,一会返回304呢?
有大神遇到这种问题么,开发环境没问题,一部署就有问题头大
304是正常的返回值,表示服务器资源没有改变。(你查一下http 304状态码,这个对应用没有影响)
如果你想要干掉304,你去掉缓存就可以了(在 response header 中加入Cache-Control: no-store),但是没必要。
至于刷新会跳到首页。
如果你页面原来的url是 http://domain.com/#project 刷新后变成 http://domain.com/ 这个有两种可能,
一个是你服务端有重定向操作,通过302或者301重定向了url,或者是你的代码里有 <Redirect />
1
304和200的区别我是有查过,
我现在预期的是返回304,因为返回304是当前页的刷新,返回200就会跳回首页了。
服务器资源应该是没有改变的啊,后端并没有做过什么修改。
或者,是否有办法知道返回200的时候服务器资源哪里发生了变化呢?
2
我暂时不清楚服务器端有没有设置302重定向,服务器端不是我在弄,但我觉得应该不是这个问题吧,302会因为单纯的刷新而发生吗?还是有时发生有时不发生这样子。
3
代码里有写Redirect,重定向的就是首页,开发环境测试的时候都是好的,但部署后有时刷新是当前页,有时就跳回首页了,还没有规律可循。
难道这是Redirect的内部机制的问题吗?会间歇性无规律地将页面重定向?
谢大佬
有没有302, 你看服务器的访问日志就可以了,先排除一下服务器的问题。
然后,你比对一下服务端返回的header中的if-none-match, 这个用来跳回首页的时候和平时是不是都一样的,这个用来确认文件有米有错误。
按照经验来说,代码中有一问题的概率最大,毕竟hashRouter几乎不会出现服务端问题。总之先排除掉服务端,再去试试客户端问题。
客户端的话, 我觉得更大的可能是你的代码里手写了 history.push , 或者 history.replace 这样的代码导致的。比如
if (process.env.NODE_ENV === "production"){
....
history.replace("/")
}
如果是 react-router的重定向造成的,就在代码里找找<Redirect to="/"/>
这种操作,你试试看改成 <Redirect to="/not-exists-0"/>
这样, 这样来找找到底是哪一行代码造成的。
我又试了下,发现:
1
不是304和200的问题,浏览器disable cache后每次返回都是200,但全200后仍然是偶尔会跳回首页。
2
代码中没有写push或者replace到地址‘/’的,只有到其他页面的。
事实上不仅刷新有问题,还存在这样的问题,一个按钮的预期效果是弹出新标签,push到pageC:
window.open('/#/project/pagec', '_blank')
但是偶尔会不到pagec,而是去到 http://domain.com
。
3
Redirect会影响,已确定是侧导航栏的整体路由设置中的Redirect决定偶尔跳回的是哪一个页面。
跳回 http://domain.com
的情况就和大佬说的一样,
http://domain.com/#/project/pagea
页面刷新后,变成 http://domain.com
,
我更改Redirect中‘/’对应的页面为pageB, http://domain.com
也就会去到pageB。
当我删除Redirect,就会去到默认的not Found 404页面,
所以问题根源应该是 刷新 或者 新标签打开push某个非’/'的地址 页面地址会偶尔变成 http://domain.com
,然后因为Redirect去到被Redirect的页面。
但Redirect只是决定了 http://domain.com
会被重定向的地址,不能决定是否会偶尔 跳到http://domain.com
吧。
我的预期是不跳到 http://domain.com
,而是正常到达 http://domain.com/#/project/pagea
之类的页面。
4
经测试,和网络质量有关系,将网络换成连接好一点的,就不会发生上述问题,但一旦换成连接差的网络,就会很经常发生上面两种问题。这个也是代码的原因吗?
已经排了一天了,快崩溃了
谢大佬
会不会是登陆验证之类的锅。
配置个无需网络数据的组件试试看还会不发生问题。这个用来排查看看是组件内出的问题,还是组件外部出得问题, 比如 UserLayout中的问题。
{ path: "/static-page": component: ()=> {
console.log("render once");
return <>This is Static Page</>
}
然后在你的 PageAComponent里面的各个生命周期中 console一下,看看路由有没有渲染正到组件,如果渲染到组件是在哪个生命周期中重定向掉的。
我用的阿里的飞冰,建了一个空的Layout加一个空Test组件来测试,地址是 http://domain.com:8080/build/#/user/static
:
export default function UserLayout(props) {
console.log('Layout', window.location); // 测试行1
return (
<Layout className={styles.Page}>
{props.children}
</Layout>
);
}
export default function index() {
console.log('window.location.href', window.location.href); // 测试行2
console.log("render once");
return (
<div>
<p>This is Static Page</p>
</div>
)
}
const routerConfig = [
{
path: '/user',
component: UserLayout,
children: [
{
path: "/static",
component: Test,
},]
}]
结果是这样仍然会偶尔跳到 http://domain.com:8080/build/.
当跳到 http://domain.com:8080/build/
时,命令行没有输出测试行1和2,而是直接如同打开的就是 http://domain.com:8080/build/
一样在运行,这是不是就说明不是组件的问题了?
难道是服务器的问题,可我我用serve -s
和Tomcat部署都有这个问题啊= =
越来越困惑了
谢大佬
表现起来像是路由组件没有正确匹配上一样。但是第三方组件出错的概率比较低。
当页面出现错误的时候,你看看 chrome有发起ajax请求,看看这部分请求附近的代码。
然后你部署本地又出错吗。
最后如果搞不定的话, 你去看看
这个是 react-router 的官方 config方式配置路由,和你这个的配置差不多,你用这个替换掉你的路由组件试试看。
我试了下, 飞冰的官方模板也有这个问题,那就说明不是我的代码的问题= =
然后,我去飞冰钉钉群问了下,他们觉得是我的网络的问题,网络被代理然后重定向了。
最主要,现在测试出来只有某一个网络连接会有这个问题,其他连接下都不会遇到这个问题,所以就决定暂时不管了
谢谢大佬的耐心解答