Субдомены, перенаправления и статические файлы с Express - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь настроить конкретную конфигурацию с помощью Express, и я не могу, по жизни, понять, как заставить все работать.Я посмотрел на тонны ресурсов и вопросов по SO, но без игры в кости.Я надеюсь, что если я объясню все, что я пытаюсь сделать, кто-нибудь сможет указать мне правильное направление.

Вот что я хочу:

  1. Для sub.domain.comВыполните некоторую логику и обслужите статические файлы из /public/sub/;
  2. Для domain.com/sub/, перепишите URL на sub.domain.com, затем продолжите ту же логику, что и в 1;
  3. Для 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 называемых" журналами, что имеет смысл, поскольку есть 1 для html, а затем 1 для css и 2 для js, , несмотря на то, что файлы css и js не позволяют читать .

Тег css в /public/sub/index.html равен <link rel="stylesheet" href="style.min.css">, и /public/sub/style.min.css существует, поэтому я не понимаю, почему он не может его найти.Кроме того, я указываю расширение, поэтому мне не нужно добавлять 'css' к staticOpts.

Обновление: Файлы CSS и JS не обслуживались, когдадостигнув sub.domain.com/ просто из-за кеша моего браузера./ facepalm

Проблема, которая остается, заключается в том, что при попытке доступа к файлу путем ввода его полного пути, например domain.com/sub/file.html, он действительно его обслуживает, когда сначала должен перенаправить вас на sub.domain.com/file.

Вот и все ...

Кто-нибудь знает, как помочь с этим?? Ура.

1 Ответ

0 голосов
/ 21 февраля 2019

, хотя 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));
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...