使用 nginx 部署 HTML5 History 模式的 Vue 项目

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 依赖的页面。

根目录部署

首先,你的项目要拥有以下特权:

  • 默认 web 服务器端口(80
  • 默认 web 服务器目录

nginx 服务器的默认目录是 /usr/share/nginx/html,你需要将本地 dist 目录下的静态文件上传至该目录。

如果你在 linux 上使用 apt-get 安装 nginx ,可以在 /etc/nginx/conf 下找到 nginx.conf 配置文件。

参照 vue-router 的后端配置示例:

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

完成后,nginx.conf 文件的 location 配置如下:

location / {
 root   /usr/share/nginx/html;
 index  index.html index.htm;
 try_files $uri $uri/ /index.html; // 后端配置
}

子目录部署

假设我们要把项目部署在 nginx 服务器的 /usr/share/nginx/html/your_folder 下,可以在 nginx.conf 文件中增加配置:

location /your_folder/ {
 alias   /usr/share/nginx/html/your_folder;
 index  index.html index.htm;
 try_files $uri $uri/ /your_folder/index.html; // 需要指定 your_folder
}

注意,这里使用 alias 指定站点目录。

root 指定的是父级目录,并且该目录下要含有和 location 后指定名称的同名目录才行,末尾加不加 “/” 无所谓。
alias 指定的是访问目录,并且末尾必须加 “/”,否则找不到文件。

一般情况下,在 location / 中配置 root,在 location /folder 中配置 alias 是一个好习惯。

代理转发

如果服务器的 80 端口已经被 tomcat 或其它服务占用,可以使用 nginx 的 proxy_pass 进行代理转发。

location / { 
 root  /usr/local/tomcat7/webapps/ROOT;
 index  index.html index.htm;
 proxy_pass  http://localhost:8080; // 代理 tomcat 端口
 }

启动 nginx 服务,就可以通过 http://localhost 访问到 http://localhost:8080 的内容了。

另外,还有一种情况也会用到 nginx 的代理转发。

使用 vue-cli 进行开发时,为了方便本地调试,通常会配置 proxyTable 代理请求:

proxyTable: {
 '/api/': {
 target: 'https://github.com',  // 服务器地址
 changeOrigin:true,
 pathRewrite: {
 '^/api': ''
 }
 },
 }

使用 axios 请求数据

axios.get('/api/user')  // 代理请求 https://github.com/api/user

使用 npm run build 命令打包发布之后,原来的请求变成 https://localhost/api/user ,而不是预测的 https://github.com/api/user ,服务器会返回 404 错误。

这是因为我们本地开发的 proxyTable 是配置在 dev 开发环境,而部署时需要配置服务器环境进行代理转发。

location /api/ {
 proxy_redirect off;
 proxy_set_header Host $host;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header X-Forwarded $proxy_add_x_forwarded_for;
 proxy_pass https://github.com/;  // 末尾带 “/” 则为 https://github.com/
}

此时,所有包含 /api/ 的请求地址都会被重定向到 https://github.com/,也就是正式环境的服务器地址。
**代码如诗 **
转帖来源于:使用 nginx 部署 HTML5 History 模式的 Vue 项目

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335