我正在尝试发布我在本地运行良好的SPA应用程序但是当我将其推送到Github Pages时,如果您直接导航到它们,则内部页面不会注册。
例如http://USER.github.io/PROJECT_NAME/
有效但http://USER.github.io/PROJECT_NAME/about
没有,因为没有重定向或重写。 index.html位于项目的根目录。
答案 0 :(得分:4)
我刚刚构建了这个小包(用于bower / npm)来解决这个确切的问题,所以我想我会在这里分享它作为你问题的答案,
https://github.com/websemantics/gh-pages-spa
如果您在404.html
和index.html
页面中加入了该套餐,它会将所有流量重定向到Index.html
,
它支持项目和用户/组织页面类型存储库,处理QueryStrings并附带一个工作示例,
答案 1 :(得分:3)
Github页面允许您创建每次都会显示的404.html
页面...存在404错误。如果http://USER.github.io/PROJECT_NAME/about
不存在,则会显示您的404.html
内容,其中包含"未找到"网址为window.location
。
因此,此页面可以包含重定向到hashbang样式路由的脚本。
例如:反应路由器,即使使用干净的网址(browserHistory)也可以理解PROJECT_NAME/#/about
之类的路由,并自动推送到PROJECT_NAME/about
。
那太丑了!
答案 2 :(得分:2)
如果您正在创建react应用,并且想要在gh页面中使用浏览器路由器,则解决方案是在根目录中创建404.html文件,并将index.html中的所有内容复制到构建好您的react-app之后,显示404.html。
当用户尝试访问您的页面时,例如https://successtar.github.io/teamwork/,GitHub将为您的index.html页面提供服务;而如果用户尝试访问https://successtar.github.io/teamwork/foo,因为它不存在,则GitHub将为您提供404.html页面。内容与index.html相同,并由此使您的react应用按预期运行。
的源代码答案 3 :(得分:1)
将此代码添加到您的index.html
和404.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
}
答案 4 :(得分:0)
由于您使用的是React,HOWTO in create-react-app
应该有效。
基本上,将homepage
字段添加到package.json
并安装gh-pages
包。
答案 5 :(得分:0)
嗯,有一个简单的方法。
在 github pages 存储库的根目录中创建一个名为 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 将启动。
答案 6 :(得分:0)
当找不到页面时,会提供 404 页面以通知用户。此外,当存在 404.html 文件时,将提供该文件而不是默认文件。
我们可以通过在项目的根目录(index.html 所在的位置)中创建一个 404.html 文件并使用重定向到 index.html 的元标记来充分利用这一点。只需将“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>
答案 7 :(得分:-1)
创建两个文件 404.md 和 404.html
---
permalink: /404.html
---
这解决了我的 Angular 应用问题。