我正在尝试使用Express设置特定的配置,但我一生无法解决如何使所有功能正常运行的问题。我看了很多关于SO的资源和问题,但都没有。我希望我能解释一下我想做的所有事情,以便有人能够指出正确的方向。
这就是我想要的:
sub.domain.com
,执行一些逻辑并提供来自/public/sub/
的静态文件; domain.com/sub/
,将URL重写为sub.domain.com
,然后按照与1中相同的逻辑进行操作; domain.com
,投放/public/
中的静态文件。无论我做什么,都会遇到其中一种问题…… 这是我当前的代码:
(根据Stock Overflaw的答案进行更新)
const baseUrl = '/bundle/cloud/public/', // This is needed as I'm hosting on NodeChef and that's their folder structure
vhost = require('vhost'), // Also tried with express-subdomain
express = require('express'),
routerMain = express.Router(),
routerSub = express.Router(),
staticOpts = { extensions: ['html', 'htm'] };
//sub.domain.com
routerSub.use((req, res, next) => {
console.log('routerSub called');
next();
});
routerSub.use(express.static(baseUrl + 'sub/', staticOpts));
// domain.com
routerMain.get('/sub', (req, res) => {
res.redirect('https://sub.domain.com/');
});
routerMain.use(express.static(baseUrl, staticOpts));
// Connect routers
app.use(vhost('sub.domain.com', routerSub));
app.use(routerMain);
以下是结果:
✅ domain.com/ /public/index.html
✅ domain.com/file /public/file.html
✅ domain.com/sub/ redirect to sub.domain.com/ (but then, see below)
✅ sub.domain.com/ /public/sub/index.html
❌ domain.com/sub/file /public/sub/file.html (should redirect to sub.domain.com/file)
当调用sub.domain.com/时,我得到4个“ routerSub被调用”日志,这是有道理的,因为html有1个,而css有1个,js有2个,尽管有css和js文件不被读取。
/public/sub/index.html中的css标记为 <link rel="stylesheet" href="style.min.css">
,并且/public/sub/style.min.css存在,所以我不明白为什么找不到它它。另外,我正在指定扩展名,因此无需在'css'
上添加staticOpts
。
更新:仅由于我的浏览器缓存,到达sub.domain.com/时未提供css和js文件。 / facepalm
仍然存在的问题是,当您尝试通过输入文件的完整路径(如domain.com/sub/file.html
)访问文件时,它确实为文件提供了服务,应该首先将您重定向到sub.domain.com/file
。
就这样...
有人知道如何提供帮助吗? 干杯。
答案 0 :(得分:1)
尽管sub.domain.com确实让我/public/sub/index.html了,但我无法获取该页面所需的CSS和JS文件
这可能是由于staticOpts = { extensions: ['html', 'htm'] };
造成的,您可能想尝试将'css', 'js'
添加到该列表中。
我觉得它正在尝试从/ public /
获取静态文件
使用一些console.log
来查看调用了哪个处理程序(如果有的话),以及我之前提出的观点不能解决此问题。
domain.com/sub/根本不会重定向
我认为您想使用res.redirect
而不是res.location
(它只设置响应头,而不是HTTP代码)。而且显然您不需要next()
。
此外,我无法使用router.use(subdomain('sub', routerSub))
进行此设置,我认为这是因为router
本身并不包含在subdomain
调用中*。但是,声明app.use
的{{1}} instad可以完成这项工作。
*:那里是纯假设,但它们使用“嵌入式”路由器的唯一方法是当它们在进行多级子域时,并且它们最后都没有显示根级路由器(即,没有包装在路由器中的路由器) router.use
通话。)
这是您的域重定向的一种可行且简化的模拟:
subdomain
我用// declare stuff
const express = require('express');
const subdomain = require('express-subdomain');
const router = express.Router();
const routerSub = express.Router();
const app = express();
// make handlers to be tested
routerSub.get('/', (req, res) => {
console.log('routerSub called');
res.send('ok');
});
router.get('/', (req, res, next) => {
console.log('router called');
res.redirect('http://api.myhost.localdomain:3000');
});
// register everything properly
app.use(subdomain('api', routerSub));
app.use(router);
// start server
app.listen(3000);
和/etc/hosts
指向本地主机设置了myhost.localdomain
文件。 (很明显。)
希望这会有所帮助!
实际上,我只考虑了api.myhost.localdomain
,忘了路线本身。这应该有帮助:
subdomain