, хотя 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
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
на localhost.(Очевидно.)
Надеюсь, это поможет!
РЕДАКТИРОВАТЬ
Действительно, я рассмотрел только вещь subdomain
, забыл о самих маршрутах.Это должно помочь:
routerMain.get(['/sub', '/sub/*'], (req, res) => {
res.redirect('https://sub.domain.com/' + (req.params[0] ? req.params[0] : ''));
});
// or, another approach easing a pass-through for the query string as well:
routerMain.get(/^(?:(\/sub\/).+|(\/sub\/?))$/, (req, res) => {
const substr = req.params[0] ? req.params[0].length : req.params[1].length;
res.redirect('https://sub.domain.com/' + req.originalUrl.substr(substr));
});