Javascript 静态网站的漂亮URL
我正在创建一个“静态”网站,我希望有如下url:Javascript 静态网站的漂亮URL,javascript,html,.htaccess,url,url-rewriting,Javascript,Html,.htaccess,Url,Url Rewriting,我正在创建一个“静态”网站,我希望有如下url: http://www.my-website/my-page-1或http://www.my-website/my-page-2 我使用jQuery方法加载我的网页内容。 这是我的index.html: <body> <nav> <ul > <li id="my-page-1-menu-item" class="menu-item" onclick="chan
http://www.my-website/my-page-1
或http://www.my-website/my-page-2
我使用jQuery方法加载我的网页内容。
这是我的index.html:
<body>
<nav>
<ul >
<li id="my-page-1-menu-item" class="menu-item" onclick="changeState('my-page-1')">
<span><a>Link 1</a></span>
</li>
<li id="my-page-2-menu-item" class="menu-item" onclick="changeState('my-page-2')">
<span><a>Link 2</a></span>
</li>
</ul>
</nav>
<!-- Content, loaded with $.load() -->
<div id="content"></div>
</body>
使用此代码,我可以访问http://www.my-website/my-page-2
点击链接2
,但如果我刷新网页或键入http://www.my-website/my-page-2
直接在浏览器地址栏中,我得到一个404错误
我不太习惯.htaccess URL重写,但我认为它应该解决我的问题
我不想使用AngularJS或其他类似的框架(除非它是一个真正的轻量级框架)如果不进行任何服务器端重写,那么这样做听起来是不可能的。刷新页面时,HTTP服务器需要根据URL为您提供适当文件的内容 但是。。如果您真的想在客户端进行URL重写,您可以进行一次通用重写,就像基于PHP的网站在内部进行重写一样(不是通过.htaccess或nginx规则,而是使用PHP脚本)。
当Web服务器上没有像“/my-page-2”这样的文件时,只需将客户端重定向到/index.html?url=/my-page-2,并使用JavaScript将其发送到适当的子页面。如果不进行任何服务器端重写,这样做似乎是不可能的。刷新页面时,HTTP服务器需要根据URL为您提供适当文件的内容 但是。。如果您真的想在客户端进行URL重写,您可以进行一次通用重写,就像基于PHP的网站在内部进行重写一样(不是通过.htaccess或nginx规则,而是使用PHP脚本)。
当Web服务器上没有像“/my-page-2”这样的文件时,只需将客户端重定向到/index.html?url=/my-page-2,并使用JavaScript发送到适当的子页面。您需要确保在使用JavaScript时:
- 修改当前页面的DOM,使其实际上是一个不同的页面
- 更改URL以标识不同的页面
这肯定解决不了问题。您可以使用它将每个请求转移回您的主页(因此您在每个URL上都有重复的内容)然后使用客户端JS来读取
位置
并计算出要加载的内容,但你也可以使用,因为你已经放弃了使用pushState
的所有优势,但在你的站点上添加了重复的内容URL(并投入大量工作来创建这些重复的内容URL).使用JavaScript时,您需要确保:
- 修改当前页面的DOM,使其实际上是一个不同的页面
- 更改URL以标识不同的页面
这肯定解决不了问题。您可以使用它将每个请求转移回您的主页(因此您在每个URL上都有重复的内容)然后使用客户端JS来读取
位置
并计算出要加载的内容,但你也可以使用,因为你已经放弃了使用pushState
的所有优势,但在你的站点上添加了重复的内容URL(并投入大量工作来创建这些重复的内容URL).您必须向onload事件添加一个事件处理程序,该事件将检查url并触发changeState(如果url包含您拥有的页面)。然后进入为“主页”提供服务的Web服务器的设置,并将所有流量“”重新路由到此主页,因此无论此url后面的页面是什么,它都将转到“主页”,并触发检查是否必须调用changeState的事件。或者,使用散列片段而不是完整的url,则不必编辑任何服务器设置,尽管这“不太漂亮”。您必须向onload事件添加事件处理程序,该事件将检查url并在url包含您拥有的页面时触发changeState。然后进入为“主页”提供服务的Web服务器的设置,并将所有流量“”重新路由到此主页,因此无论此url后面的页面是什么,它都将转到“主页”,并触发检查是否必须调用changeState的事件。或者使用散列片段而不是完整的url,那么您就不必编辑任何服务器设置,尽管这“不太漂亮”。我理解您使用JavaScript的方法,但即使我不使用JavaScript加载我的内容或管理我的url,我的应用程序也无法完全工作。我没有时间在每个功能上设置优雅的降级。我会一直使用重复的代码和.html URL。Thanks@Tako-使用hashbang比使用pushState和重复URL进行黑客攻击更好。它们更易于实现,不会给您带来重复的内容问题。我理解您的JavaScript方法,但即使我不使用JavaScript加载我的内容或管理
function changeState(url) {
window.history.pushState(url, 'Title', url);
loadStateData(url);
}
function loadStateData(state) {
var content = '#content';
$(content).load( 'views/' + state + '.html');
// Manage menu style
$('.menu-item').removeClass('active');
$('#' + state + '-menu-item').addClass('active');
}