求助!遇到了 vue 跟 nginx 奇葩问题,我人傻了

2020-02-26 23:10:34 +08:00
 badtypea

撞上了个难搞的项目,前端用 vue 写的,没有域名,IP 直接访问。

现在客户要求加个首页,IP 直接访问,然后可以跳转回原来的 vue 页面。

但问题是他源码没了,我改不了 baseUrl,用 nginx 各种配置二级目录也一直不行...

今天弄了一天的 nginx.conf,我人都要傻了,有没有熟悉这方面的老哥,求指点指点。

4722 次点击
所在节点    NGINX
27 条回复
sleepm
2020-02-26 23:43:02 +08:00
直接改打包好的代码里的 baseUrl。。
clf
2020-02-26 23:59:04 +08:00
你说的哪个 baseUrl……是网络请求库的 baseUrl 还是 Vue build 生成文件时的 baseUrl 还是啥?

baseUrl 原来的值大致是怎么样的(如果有 IP 或域名就用`IP 地址`或`域名`代替,也不会泄露)

原来 Vue 前端路由是怎么样配置的

现在网站要求的大致结构层级是怎么样的

求助的时候麻烦交代清楚这些问题……不然我除了吃瓜也不知道回复你什么。
Beebird
2020-02-27 00:00:22 +08:00
不懂 vue,但理论上 nginx 的 rewrite 应该可以做到啊,楼主讲得太简略了不好判断。
rockyou12
2020-02-27 00:02:44 +08:00
难道你 vue 源码还能吧 baseUrl 写死 ip 嘛,不然应该随便改的
fniy
2020-02-27 00:16:45 +08:00
没有明白为什么实现不了。做 301 跳转,配置参考:
server {
listen 80;
rewrite ^/(.*) http://web.com/$1 permanent;
}
airyland
2020-02-27 00:31:22 +08:00
源码没了你搜索到相关位置不也可以改。
badtypea
2020-02-27 00:36:13 +08:00
@sleepm 就是找不到...
badtypea
2020-02-27 00:46:42 +08:00
@lychs1998 哈,不好意思,因为找不到以前负责的人我也不知道原来值是什么。原项目是 8.8.8.8 (举例)直接访问 vue 项目,现在客户是要求加个首页,首页用 8.8.8.8 访问,然后首页能跳转 8.8.8.8/example 下访问 vue。我虽然在 nginx 配置了 8.8.8.8/example 但却 vue 页面却是空白的,只能查到要改 bulid 时 vue.config.js 的 baseUrl,但没源码就很无语...
badtypea
2020-02-27 00:48:32 +08:00
@fniy 可能是我不会用,太菜了
ss098
2020-02-27 01:02:22 +08:00
Vue 提供的模板是默认部署到根目录的,如果你可以访问 example 而页面空白,我推测是页面所需的资源文件仍以根目录请求。

你可以试试添加 HTML base 标签指定资源目录为 example。
asmoker
2020-02-27 01:10:45 +08:00
是不是需要加 tryfiles ?

加了一级目录,但是原项目静态资源路径应该还是根的,根据把静态资源再单独处理下。
badtypea
2020-02-27 01:27:27 +08:00
@ss098 多谢提醒,想起来 example 页面的 index.html 之前是无法读取同目录下 css、js 目录的文件的,我把这些目录移到根目录下控制台才没报错,但是却一片空白。base 标签没用过,貌似无法直接根据目录找到资源...
badtypea
2020-02-27 01:29:37 +08:00
@asmoker 原 nginx 配置有加,我发个类似的配置出来
badtypea
2020-02-27 01:30:16 +08:00
server {
listen 80;

# 新增首页
location / {
alias /zh-helper/;
try_files $uri $uri/ /index.html last;
}

# 后台项目
location /zh-admin {
alias /zh-helper/zhanheng-funding-helper-admin/dist/;
try_files $uri $uri/ /index.html last;
}
# 后台项目
location /example{
# proxy_pass http://zhanheng-funding-helper.oss-cn-shenzhen.aliyuncs.com;
# proxy_hide_header Content-Disposition;
alias /zh-helper/zhanheng-funding-helper/dist/;
try_files $uri $uri/ /index.html;
}
sodatea
2020-02-27 01:37:38 +08:00
在编译后的代码里找 l.p="/" 然后替换掉引号里的内容。
sodatea
2020-02-27 01:41:59 +08:00
如果用了 vue-router 的话那编译后的代码里应该还有一处 base:"/" 也替换掉
inpro
2020-02-27 01:42:41 +08:00
这个如果可以找到 Vue 打包后的 publicPath 可解,看了下这个值可能是 “”,就比较麻烦了,只配置 nginx,即使 /example 访问到了 Vue,Vue Router 也会将 /example 看作是 Vue 内部路由而显示白屏。倒是有个变通的办法,如果不要求一定是 /example 的话,可以将 / 配置为首页,当访问 / 时,检测有没有带 frontpage_loaded 这个 Cookie,如果没有(客户首次访问),返回首页,如果有,返回 Vue。首页跳转 Vue 的按钮在点击时设置这个 Cookie,并跳转 /?任意查询字符串,nginx 监测到 Cookie 返回 Vue,这个方案的缺点是 1 需要 Cookie 支持 2 客户只会看到一次首页,下次访问首页时看到的是 Vue
inpro
2020-02-27 01:45:20 +08:00
@badtypea 楼上的方法比较好,我以为地址的变量会在编译时 uglify 掉
badtypea
2020-02-27 02:13:45 +08:00
@sodatea 嗯,找到了 i.p 跟 base,然后都改成了 "/example",但访问还是空白,也没报错
badtypea
2020-02-27 02:15:18 +08:00
@inpro 谢谢提供方案,到时跟客户讨论看看,虽然估计会被 pass 掉

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/647872

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX