umi发布打包会有代理问题,官方没给出具体操作步骤;下面介绍两种运行环境proxy的设置方法;
核心问题,为什么本地dev环境可以代理成功,而放在服务器或xampp上,或nginx 上就不能正常访问其它端口或链接;
本质问题是浏览器的同源策略;
1:dev环境用本地的proxy代理解决了同源问题;umi官方api有介绍;
2:我们生成环境需要解决的同源问题;
这里准确来讲应该属于运维来处理此问题;但是我们也得知道如何处理;
1:用node启的服务;
/**
* Created by xj on 2019/3/24.
*/
const Koa = require("koa");
const bodyParser = require("koa-bodyparser");
const Nunjucks = require("nunjucks");
const views = require("koa-views");
const debug = require("debug")("koa-weapp-demo");
const config = require("./config");
// const router = require("./router");
const Router = require("koa-router")();
const path = require("path");
const moment = require("moment");
const app = new Koa();
const { createProxyMiddleware } = require("http-proxy-middleware");
const Koa2Connect = require("koa2-connect");
//打印
const logger = require("koa-logger");
app.use(logger());
const __static = require("koa-static");
// parse request body:
app.use(bodyParser());
app.use((ctx, next) => {
const start = Date.now();
return next().then(async () => {
const ms = Date.now() - start;
if (ctx.response.status == 200 || ctx.response.status == 302) {
return;
} else {
ctx.redirect("/404");
}
console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
});
});
const exampleProxy = createProxyMiddleware({
pathFilter: "/api",
// 匹配以/api开头的路径
pathRewrite: { "/api": "" },
// 把/api去除掉
target: "http://localhost:3000/",
// target host with the same base path
changeOrigin: true,
// needed for virtual hosted sites
});
app.use(__static(__dirname + "/public"));
app
// .use(router.routes())
// .use(router.allowedMethods())
.use(Koa2Connect(exampleProxy))
.listen(config.port, () => {
debug(`listening on port ${config.port}`),
console.log(`listening on port ${config.port}`);
});
根据文件下载需要的依赖,不用的可以不下,这是个以前项目复制出来的模板,没删,需要啥用啥;
这里需要代理prox 相关的,static ,公共文件相关的,koa2-connect处理express 的prox相关的(类似把express转义成koa可用的包);
简单来说就是把umi打包好的静态文件放public里面;直接跑;代理的配置看一眼都懂,在代码配置里;
2:xampp
静态文件放hotdocs里;
修改apache配置文件httpd.conf
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_express_module modules/mod_proxy_express.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
#LoadModule proxy_hcheck_module modules/mod_proxy_hcheck.so
LoadModule proxy_html_module modules/mod_proxy_html.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_http2_module modules/mod_proxy_http2.so
LoadModule proxy_scgi_module modules/mod_proxy_scgi.so
LoadModule proxy_uwsgi_module modules/mod_proxy_uwsgi.so
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
照着设置#就行,该去的去该留的留;
然后是下面这个proxy文件
重启apache;