Netlify刷新页面404(使用React和react-router)

时间:2019-09-23 15:23:47

标签: reactjs react-router http-status-code-404 netlify

我已经使用Netlify部署了我的网站,但路由遇到问题。

这是我的网站:https://redux-co.netlify.com/

还有我的GitHub存储库:https://github.com/jenna-m/redux-co

具体来说,如果用户导航到主页以外的任何页面并刷新页面,则将呈现默认的Netlify 404。在404页面上,如果我导航回到主页并刷新,则呈现主页。

此外,我的自定义404页面无法像在localhost:3000上那样工作,但是我希望在处理自定义404组件之前首先弄清此刷新问题。

我正在使用React和react-router,并且我了解到由于我在使用react-router,因此我的网站不会立即部署。


这是我的_redirects文件,与我的/public文件位于index.html文件夹中:

/*    /index.html   200

这是我的“build”位于package.json

…
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build && cp build/index.html build/404.html",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  }
…

我了解到其他人正在经历这种情况以及他们为解决该问题所做的工作。到目前为止,这是我所引用的……

https://www.freecodecamp.org/news/how-to-deploy-a-react-application-to-netlify-363b8a98a985/

https://hugogiraudel.com/2017/05/13/using-create-react-app-on-netlify/

此人使用的是Vue而不是React,但我还是尝试了以下解决方案:

https://github.com/vuejs/vuepress/issues/457#issuecomment-390206649

https://github.com/vuejs/vuepress/issues/457#issuecomment-463745656

9 个答案:

答案 0 :(得分:3)

这很简单,对我有用。我找到了此链接https://create-react-app.dev/docs/deployment#netlify

因此,根据该链接的建议,我在_redirects文件夹内添加了/public文件,例如/public/_redirects。然后,我将/* /index.html 200粘贴到_redirects文件中。我在VS Code中完成了所有这些工作,之后我推送到github,然后每次我推送到github时我的netlify都会自动重新部署。我的问题已解决,刷新不再带来404错误。

在我的package.json中,构建部分如下所示:

"scripts": {
   "start": "react-scripts start",
   "build": "react-scripts build",
   "test": "react-scripts test",
   "eject": "react-scripts eject"
}

注意: 有些文章说您需要在_redirects文件夹中添加build,但是在我的情况下build文件夹不在推送到github的内容之列,所以这就是为什么向{{ 1}}文件夹对我来说效果更好,因为公用文件夹可以与我的代码一起推送。

答案 1 :(得分:2)

从公用文件夹中删除_redirects,然后将netlify.toml移至git仓库的根目录more info。还要从构建脚本&& cp build/index.html build/404.html中删除-您不再需要

答案 2 :(得分:0)

从index.js中,只需用HashRouter包装您的组件即可,而不是之前的任何东西。 不要忘记从react-router-dom导入HashRouter。

太神奇了。

答案 3 :(得分:0)

netlify.toml文件添加到项目的根目录,并将以下代码粘贴到其中:

[[redirects]]
  from = "/*"
  to = "/"
  status = 200

推送并重新部署您的应用程序,即可完成。

答案 4 :(得分:0)

enter code here使用 HashRouter 代替 BrowserRouter 解决问题

import { HashRouter as Router, Switch, Route } from 'react-router-dom'
//instead of 
import { BrowserRouter as Router, Switch, Route } from 'react-router-dom'

答案 5 :(得分:0)

我在 netlify 中遇到了同样的刷新问题。对我来说,这是一系列的变化。在我的反应配置之前,我有一个指向子文件夹 (/sandbox/appfolder) 以在我的托管沙箱中使用(我希望我可以恢复到更改以下参数)。为了能够在 netlify 中进行持续部署,我在其他答案中启发了以下内容。使用我自己的托管沙箱时,我没有 _redirects 并且主页指向子文件夹。

编辑:要从我网站的子文件夹运行,我必须将 .htaccess 编辑为 RewriteRule ^ /sandbox/myapp/index.html [L],将 package.json 编辑为 "homepage": "/sandbox/myapp"

在/package.json:

"homepage": "/",

在/public/.htaccess

RewriteEngine On
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
RewriteRule ^ - [L]

# Fallback all other routes to index.html    
RewriteRule ^ /index.html [L]

在我的主要组件 src/App.js 中:

<BrowserRouter basename = {process.env.PUBLIC_URL}>

在 public/index.html

<base href="%PUBLIC_URL%/">

最后在 /public/_redirects 中提到

/* /index.html 200

答案 6 :(得分:0)

我遇到了类似的问题 所以我在 public 文件夹中创建了 _redirects 文件并放入以下代码

/* /index.html 200

再次构建文件npm run build 并为我工作 resource for similar issue

答案 7 :(得分:0)

在根目录中创建_redirects_redirects 文件中提及您的应用路由,例如: /家 /条款和条件

就是这样。

答案 8 :(得分:0)

试试这个

之前遇到过同样的问题,发现这是因为我使用代理连接到我的后端服务器。假设后端应用程序位于此 URL example.com。因此,与其在 package.json 中将其作为代理字段提及,我建议仅将链接放在您的函数中。

避免这种情况

{
  "name": "frontend",
  "version": "0.1.0",
  "proxy": "https://example.com",
  "private": true,
....
....
}

如果,使用 redux 然后将后端 url 放入带有 axios 或 fetch 的操作中。 (另外,尝试删除 package-lock.json 文件,然后将没有它的代码推送到您的 Github 上,然后将其连接到 netifly,然后重新部署您的站点)

示例代码(注意api调用)

export const listArticles = () => async (dispatch, getState) => {
    try {
        dispatch({
            type: ARTICLES_LIST_REQUEST
        })

        // api call
        const { data } = await axios.get("https://example.com/api/articles/")

        dispatch({
            type: ARTICLES_LIST_SUCCESS,
            payload: data
        })

    } catch (error) {
        dispatch({
            type: ARTICLES_LIST_FAIL,
            payload: error.response && error.response.data.detail ? error.response.data.detail : error.message
        })
    }
}

我的 package.json 文件

{
  "name": "frontend",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@testing-library/jest-dom": "^5.11.10",
    "@testing-library/react": "^11.2.6",
    "@testing-library/user-event": "^12.8.3",
    "axios": "^0.21.1",
    "mdbreact": "^5.0.2",
    "react": "^17.0.2",
    "react-bootstrap": "^1.5.2",
    "react-dom": "^17.0.2",
    "react-redux": "^7.2.3",
    "react-router-bootstrap": "^0.25.0",
    "react-router-dom": "^5.2.0",
    "react-scripts": "4.0.3",
    "redux": "^4.0.5",
    "redux-devtools-extension": "^2.13.9",
    "redux-thunk": "^2.3.0",
    "web-vitals": "^1.1.1"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": [
      "react-app",
      "react-app/jest"
    ]
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  }
}