Github Pages是否有配置,可以将所有内容重定向到index.html以适用于单页应用程序?

22
我试图发布我本地正常运行的 SPA 应用程序,但是当我将其推送到 Github Pages 时,如果您直接导航到内部页面,则不会注册。例如 http://USER.github.io/PROJECT_NAME/ 可以工作,但是 http://USER.github.io/PROJECT_NAME/about 不行,因为没有重定向或重写。 index.html 位于项目的根目录。

3
如果你没有服务器资源来生成pushState URI所请求的实际页面,则可以使用带有哈希符号的方式构建应用程序。 - Quentin
当你说本地,是指使用Jekyll吗? - bitoiu
不,我还没有尝试安装Jekyll。我不知道如何配置它来实现我所说的功能。 - tkiethanom
1
据我所知,现在哈希铭文是唯一的方法。但是有一个问题 https://github.com/isaacs/github/issues/408 - Alexey Sidash
@tkiethanom — 你没理解重点。如果你使用真实的URL,那么每个URL都不应该给你主页(然后依靠JavaScript将其转换为URL所应反映的页面)。 - Quentin
显示剩余5条评论
10个回答

15
如果你正在创建一个 React 应用,并且想在 gh pages 中使用 Browser router,解决方法是在你的根目录中创建 404.html 文件,并在构建你的 React 应用后将所有内容从 index.html 复制到 404.html。

当用户访问您的页面时,例如 https://successtar.github.io/teamwork/,GitHub 将提供您的 index.html 页面,而如果用户尝试访问 https://successtar.github.io/teamwork/foo,由于不存在,GitHub 将提供 404.html 页面,其内容与 index.html 相同,这样您就可以如预期地使 React 应用程序正常工作。

这里是示例的源代码:https://github.com/successtar/teamwork/tree/gh-pages

更新

您可以自动化这个过程,每次运行 npm run build 自动生成 404.html 文件。

第一步:安装 shx 以进行跨平台命令,如下所示:npm install shx --save-dev

第二步:转到 package.json,在脚本块中将 "build": "react-scripts build" 替换为 "build": "react-scripts build && shx cp build/index.html build/404.html"

就是这样。

无论何时运行 npm run build,都会自动生成404.html文件。

2
甚至可以使用 mv index.html 404.html。非常好用,谢谢。 - Joseph Garrone
保留两个文件是很好的。404.html 文件只是在 GitHub 无法提供 index.html 文件时作为备用文件。 - successtar
3
将"index.html"文件复制为"404.html"文件。 - Nick Roz
index.html 复制到 404.html 是唯一与 NGINX 或 Apache 重定向单页面应用程序的真实行为相匹配的解决方案。其他解决方案不允许重新加载页面并正确触发 React 应用程序的 BrowserRouter,因为它们只会重定向到主页。 - Amin NAIRI

9
Github Pages允许您创建一个404.html页面,每当出现404错误时都会显示该页面。如果http://USER.github.io/PROJECT_NAME/about不存在,则会显示您的404.html内容,并将“未找到”的URL作为window.location
因此,此页面可以包含一个脚本,用于重定向到哈希样式路由。例如:React路由器,即使使用干净的URL(browserHistory),也可以理解像PROJECT_NAME/#/about这样的路由,并自动推送到PROJECT_NAME/about
那很丑!

这更接近我想要的,但我同意它看起来不太好看。我现在可以暂时使用哈希。 - tkiethanom

7
我刚刚为解决这个确切问题而构建了一个小型软件包(适用于bower / npm),所以我想将其作为回答分享在这里。

https://github.com/websemantics/gh-pages-spa

如果你在404.htmlindex.html页面中包含该软件包,它将重定向所有流量到Index.html页面。
它支持项目用户/组织页面类型的存储库,处理查询字符串,并附带一个可工作的示例。

很酷,下次我需要使用 gh pages 时我会去看看。 - tkiethanom
2
不友好的SEO。对于任何不存在的文件,它都会发送404状态。例如,如果文件foo不存在,则http://example.com/foo将向我发送404状态。 - Tabrez Ahmed
这是一个不错的尝试,但我不喜欢在我的URL字段中看到快速重定向。我会选择#样式。 - takasoft

2

对我来说,我一直欣赏最简单的解决方案。

只需添加一个文件,404.html

全部内容:

<script>
    window.location.href = "/";
</script>

就是这样!希望能有所帮助!


2

当页面未找到时,会提供404页面来通知用户。如果存在404.html文件,则会提供该文件而不是默认页面。

我们可以利用这一点,在项目的根目录(即index.html所在位置)创建一个404.html文件,并添加一个重定向到index.html的meta标签。只需将“https://example.com”替换为您的域名。

我尝试过这种方法,希望对您也有帮助!

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="refresh" content="0; URL='https://example.com'" />
    <title>404 - redirect</title>
</head>

<body></body>

</html>


工作得非常出色。 - glowkeeper

2

好的,有一个简单的解决办法。 在您的GitHub页面存储库的根目录中创建一个名为404.html的文件。 该文件的内容应为:

<!DOCTYPE html>
<html lang="en" id="htmlbody">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Loading...</title>
</head>
<body>
    <script>
        var doc = document.getElementById('htmlbody');
        xhttp = new XMLHttpRequest();
        xhttp.onreadystatechange = function() {
            if (this.readyState == 4) {
                if (this.status == 200) {
                    doc.innerHTML = this.responseText;
                    doc.removeAttribute("id");
                }
                if (this.status == 404) doc.innerHTML = "Page not found.";
            }
        }
        xhttp.open("GET", "index.html", true);
        xhttp.send();
    </script>
</body>
</html>

基本上,该脚本只是使用Javascript在index.html上执行XHR并使内容成为文档。
我不愿使用document.body,因为我考虑更新整个文档,但如果它不起作用,请将doc变量更改为document.body
不确定这是否有效,所以我会非常感谢反馈。
请记住在index.html中使用相同的域,否则CORS将介入。

0
这可以在package.json中的一行中完成,而无需添加依赖项。

(package.json)

{
    .
    .
    .
    "scripts": {
        "postbuild": "cp ./build/index.html ./build/404.html'",
        .
        .
        .
    }
}
工作原理
  1. 每当你运行npm run build(就像在部署过程中一样),postbuild脚本将被触发。
  2. postbuild脚本只是将你的index.html复制到404.html。
  3. 当GH页面收到无法找到的资源请求时,它会提供404.html页面,该页面现在只是你的SPA应用程序,并且所有的路由信息/some_route也将被发送到你的SPA应用程序中。

0

创建了两个文件404.md和404.html

  1. 404.md应该包含以下内容:
---
permalink: /404.html
---
  1. 404.html 应该与 index.html 具有相同的内容。

这解决了我在 Angular 应用程序中遇到的问题。


0
将以下代码添加到您的index.html404.html文件中:
  // if it's on index.html
  if (window.sessionStorage.path) {
  let path = window.sessionStorage.path; // gets the path saved on sessionStorage
  window.history.pushState(null, null, path); // push it on url
  window.sessionStorage.removeItem('path'); // removes from session

} else { // if it's on 404.html (path doens't exist)
  let path = window.location.pathname; // get the path url
  window.sessionStorage.path = path; // saves on sessionStorage
  window.location.href = '/'; // go to index
}

-1

抱歉回复晚了。

GitHub将查找404.html文件;如果未找到,则GitHub将显示其默认页面。

因此,您可以创建一个404.html文件,将用户重定向到index.html文件。

为此,您需要使用原始的Javascript;请参见下面的示例。

404.html

<!DOCTYPE html>
<html lang="en">

<head>
  <title>Page not found</title>
</head>

<body>
  <noscript>You need to enable JavaScript to run this app.</noscript>
  <script>
    const urlToRedirect = 'https://rajgohil07.github.io/todo-app-redux/'
    window.location = urlToRedirect;
  </script>
</body>

</html>

您可以将您的项目链接传递给urlToRedirect变量。


这不是SPA的工作方式。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接