Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 静态网站的漂亮URL_Javascript_Html_.htaccess_Url_Url Rewriting - Fatal编程技术网

Javascript 静态网站的漂亮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

我正在创建一个“静态”网站,我希望有如下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="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以标识不同的页面
…您还应确保服务器本身也可以生成该页面

那样的话,如果使用JavaScript,那么一切都可以正常工作。这是一个最佳实践

这可能需要复制您的逻辑服务器端,这可能需要大量的工作。健壮性+客户端性能黑客并不能廉价地协同工作。考虑和作为技术来加速这一点。

我不太习惯.htaccess URL重写,但我认为它应该解决我的问题


这肯定解决不了问题。您可以使用它将每个请求转移回您的主页(因此您在每个URL上都有重复的内容)然后使用客户端JS来读取
位置
并计算出要加载的内容,但你也可以使用,因为你已经放弃了使用
pushState
的所有优势,但在你的站点上添加了重复的内容URL(并投入大量工作来创建这些重复的内容URL).

使用JavaScript时,您需要确保:

  • 修改当前页面的DOM,使其实际上是一个不同的页面
  • 更改URL以标识不同的页面
…您还应确保服务器本身也可以生成该页面

那样的话,如果使用JavaScript,那么一切都可以正常工作。这是一个最佳实践

这可能需要复制您的逻辑服务器端,这可能需要大量的工作。健壮性+客户端性能黑客并不能廉价地协同工作。考虑和作为技术来加速这一点。

我不太习惯.htaccess 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');
}