zoukankan      html  css  js  c++  java
  • HTML5 History 模式

    vue-router 默认 hash 模式 —— 使用 URL 的 hash 来模拟一个完整的 URL,于是当 URL 改变时,页面不会重新加载。

    如果不想要很丑的 hash,我们可以用路由的 history 模式,这种模式充分利用 history.pushState API 来完成 URL 跳转而无须重新加载页面。

    const router = new vueRouter({
      mode: ‘history‘,
      routes: [...]
    })

    当你使用 history 模式时,URL 就像正常的 url,例如 http://yoursite.com/user/id,也好看!

    不过这种模式要玩好,还需要后台配置支持。因为我们的应用是个单页客户端应用,如果后台没有正确的配置,当用户在浏览器直接访问 http://oursite.com/user/id 就会返回 404,这就不好看了。

    所以呢,你要在服务端增加一个覆盖所有情况的候选资源:如果 URL 匹配不到任何静态资源,则应该返回同一个 index.html 页面,这个页面就是你 app 依赖的页面。

    广州vi设计公司http://www.maiqicn.com 办公资源网站大全 https://www.wode007.com

    后端配置例子

    <IfModule mod_rewrite.c>
      RewriteEngine On
      RewriteBase /
      RewriteRule ^index.html$ - [L]
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteRule . /index.html [L]
    </IfModule>

    除了 mod_rewrite,你也可以使用 FallbackResource。

    nginx

    location / {
      try_files $uri $uri/ /index.html;
    }

    原生node.js

    const http = require(‘http‘)
    const fs = require(‘fs‘)
    const httpPort = 80
    
    http.createServer((req, res) => {
      fs.readFile(‘index.htm‘, ‘utf-8‘, (err, content) => {
        if (err) {
          console.log(‘We cannot open "index.htm" file.‘)
        }
    
        res.writeHead(200, {
          ‘Content-Type‘: ‘text/html; charset=utf-8‘
        })
    
        res.end(content)
      })
    }).listen(httpPort, () => {
      console.log(‘Server listening on: http://localhost:%s‘, httpPort)
    })

    基于 Node.js 的 Express

    对于 Node.js/Express,请考虑使用 connect-history-api-fallback 中间件。

    Internet Information Services (IIS)

    1. 安装 IIS UrlRewrite

    在你的网站根目录中创建一个 web.config 文件,内容如下

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
      <system.webServer>
        <rewrite>
          <rules>
            <rule name="Handle History Mode and custom 404/500" stopProcessing="true">
              <match url="(.*)" />
              <conditions logicalGrouping="MatchAll">
                <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
              </conditions>
              <action type="Rewrite" url="/" />
            </rule>
          </rules>
        </rewrite>
      </system.webServer>
    </configuration>

    Caddy

    rewrite {
        regexp .*
        to {path} /
    }

    Firebase 主机

    在你的 firebase.json 中加入:

    {
      "hosting": {
        "public": "dist",
        "rewrites": [
          {
            "source": "**",
            "destination": "/index.html"
          }
        ]
      }
    }

    警告

    给个警告,因为这么做以后,你的服务器就不再返回 404 错误页面,因为对于所有路径都会返回 index.html 文件。为了避免这种情况,你应该在 Vue 应用里面覆盖所有的路由情况,然后在给出一个 404 页面。

    const router = new VueRouter({
      mode: ‘history‘,
      routes: [
        { path: ‘*‘, component: NotFoundComponent }
      ]
    })

    或者,如果你使用 Node.js 服务器,你可以用服务端路由匹配到来的 URL,并在没有匹配到路由的时候返回 404,以实现回退。

  • 相关阅读:
    项目检出JRE问题(Unbound classpath container: 'JRE System Library [JavaSE-1.7]' in project 'idweb')
    OpenCV 4 Python高级配置—安装setuptools,matplotlib,six,dateutil,pyparsing 完整过程
    OpenCV249 for python278 最简配置方案
    纯Python综合图像处理小工具(4)自定义像素级处理(剪纸滤镜)
    纯Python综合图像处理小工具(3)10种滤镜算法
    纯Python综合图像处理小工具(2)图像增强
    纯Python综合图像处理小工具(1)分通道直方图
    树莓派2代干货帖(第一天)按图索骥的搭建
    jQuery慢慢啃之特效(八)
    jQuery慢慢啃之事件(七)
  • 原文地址:https://www.cnblogs.com/ypppt/p/13677392.html
Copyright © 2011-2022 走看看