Проблема перенаправления URL-адресов Express.js: как перенаправить запросы на основе имени хоста и пути? ⇐ Javascript
-
Гость
Проблема перенаправления URL-адресов Express.js: как перенаправить запросы на основе имени хоста и пути?
Я работаю над проектом перенаправления URL-адресов в node.js и express.js, размещенном на EC2.
В AWS Route53 я управляю десятью основными доменами, каждый из которых сопровождается различными поддоменами. Вот краткий обзор:
[*]
test.com с такими поддоменами, как app.test.com, < code>app2.test.com и т. д.
[*]
example.com с такими поддоменами, как redirect.example.com, < code>help.example.com и другие.
В этих доменах настроены записи CNAME, указывающие на стандартный субдомен по адресу subdomain.myorigindomain.com.
В моей базе данных я храню записи, включающие основной домен, субдомен, строку перенаправления и пункт назначения. Кроме того, я определяю пункт назначения по умолчанию для случаев, когда у запроса нет определенного пути.
Ниже приведен мой код для обработки перенаправления:
const app = express(); app.use(bodyParser.json()); app.use(express.static(path.join(__dirname, "/../client/build"))); app.get("*", async (req, res) => { res.setHeader("Контроль доступа-Разрешить-Origin", "*"); пытаться { вар realUrl = (req.connection.encrypted ? «https» : «http») + «://» + req.headers.host + req.url; const Url = url.parse(realUrl, true); Url.remoteAddress = req.header("x-forwarded-for") || req.connection.remoteAddress; const redirectString = Url.path.substr(1); если (перенаправитьСтроку) { //ищем в базе данных и перенаправляем в пункт назначения }еще{ //ищем субдомен и домен в базе данных и перенаправляем в пункт назначения по умолчанию } }) Проблема:
Каждый раз, когда пользователь отправляет запрос из исходного домена subdomain.myorigindomain.com или любого основного домена, например app.test.com, мое внешнее приложение обслуживается с использованием следующей строки кода:
app.use(express.static(path.join(__dirname, "/../client/build")));
При удалении вышеуказанного кода строки все запросы обрабатываются *, и мой интерфейс не обслуживается для исходного домена subdomain.myorigindomain .com
Ожидаемое поведение:
Мое внешнее приложение будет обслуживаться только тогда, когда пользователь отправит запрос с моего исходного домена, а именно subdomain.myorigindomain.com.
Во всех остальных случаях, например при запросах от app.test.com, маршрутизация будет обрабатываться * маршрут.
Пример:
Случай 1: Когда кто-то нажимает app.test.com/help в браузере, он переходит на *< /code> маршруты и поиск **/help ** в базе данных и перенаправление к месту назначения
Случай 2 Когда кто-то нажимает app.test.com в браузере, запрос должен обрабатываться * маршрутизируется и ищет URL-адрес по умолчанию app.test.com и перенаправляет на URL-адрес по умолчанию.
Но в приведенном выше Случае 2 запрос обрабатывается следующей строкой кода:
app.use(express.static(path.join(__dirname, "/../client/build"))); и мой интерфейс обслуживается.
Случай 3. Когда кто-то обращается к моему исходному домену, например subdomain.myorigindomain.com, он должен обслуживать только мое внешнее приложение.
Случай 3: когда кто-то обращается к моему исходному домену, например subdomain.myorigindomain.com, он должен обслуживать только мое внешнее приложение.Случай 3:. р>
Вот что я пробовал:
Код с комментариями ниже:
//app.use(express.static(path.join(__dirname, "/../client/build"))); Добавлено условие, если имя хоста совпадает с источником, а затем перенаправить во внешний интерфейс и отправить index.html по маршруту *, как показано ниже. :
app.get("*", async (req, res) => { res.setHeader("Контроль доступа-Разрешить-Origin", "*"); пытаться { вар realUrl = (req.connection.encrypted ? «https» : «http») + «://» + req.headers.host + req.url; const Url = url.parse(realUrl, true); Url.remoteAddress = req.header("x-forwarded-for") || req.connection.remoteAddress; if (Url.hostname === 'subdomain.myorigindomain.com' && (Url.pathname === '/' || Url.pathname === '/admin')) { /** * Я попробовал ниже, попробовал все нижеперечисленные вещи * Способ 1: return res.sendFile(path.join(__dirname + "/../client/build/index.html")); * Способ 2: * res.set("location", `${configTable.origin}/admin`); * res.set("Cache-Control", "no-store"); * return res.status(301).send(); * Способ 3: return res.redirect(`${configTable.origin}/admin`) * Метод 4: app.use(express.static(path.join(__dirname, "/../client/build"))); */ } Но ничего не помогло.
Как я могу решить эту проблему?
Я работаю над проектом перенаправления URL-адресов в node.js и express.js, размещенном на EC2.
В AWS Route53 я управляю десятью основными доменами, каждый из которых сопровождается различными поддоменами. Вот краткий обзор:
[*]
test.com с такими поддоменами, как app.test.com, < code>app2.test.com и т. д.
[*]
example.com с такими поддоменами, как redirect.example.com, < code>help.example.com и другие.
В этих доменах настроены записи CNAME, указывающие на стандартный субдомен по адресу subdomain.myorigindomain.com.
В моей базе данных я храню записи, включающие основной домен, субдомен, строку перенаправления и пункт назначения. Кроме того, я определяю пункт назначения по умолчанию для случаев, когда у запроса нет определенного пути.
Ниже приведен мой код для обработки перенаправления:
const app = express(); app.use(bodyParser.json()); app.use(express.static(path.join(__dirname, "/../client/build"))); app.get("*", async (req, res) => { res.setHeader("Контроль доступа-Разрешить-Origin", "*"); пытаться { вар realUrl = (req.connection.encrypted ? «https» : «http») + «://» + req.headers.host + req.url; const Url = url.parse(realUrl, true); Url.remoteAddress = req.header("x-forwarded-for") || req.connection.remoteAddress; const redirectString = Url.path.substr(1); если (перенаправитьСтроку) { //ищем в базе данных и перенаправляем в пункт назначения }еще{ //ищем субдомен и домен в базе данных и перенаправляем в пункт назначения по умолчанию } }) Проблема:
Каждый раз, когда пользователь отправляет запрос из исходного домена subdomain.myorigindomain.com или любого основного домена, например app.test.com, мое внешнее приложение обслуживается с использованием следующей строки кода:
app.use(express.static(path.join(__dirname, "/../client/build")));
При удалении вышеуказанного кода строки все запросы обрабатываются *, и мой интерфейс не обслуживается для исходного домена subdomain.myorigindomain .com
Ожидаемое поведение:
Мое внешнее приложение будет обслуживаться только тогда, когда пользователь отправит запрос с моего исходного домена, а именно subdomain.myorigindomain.com.
Во всех остальных случаях, например при запросах от app.test.com, маршрутизация будет обрабатываться * маршрут.
Пример:
Случай 1: Когда кто-то нажимает app.test.com/help в браузере, он переходит на *< /code> маршруты и поиск **/help ** в базе данных и перенаправление к месту назначения
Случай 2 Когда кто-то нажимает app.test.com в браузере, запрос должен обрабатываться * маршрутизируется и ищет URL-адрес по умолчанию app.test.com и перенаправляет на URL-адрес по умолчанию.
Но в приведенном выше Случае 2 запрос обрабатывается следующей строкой кода:
app.use(express.static(path.join(__dirname, "/../client/build"))); и мой интерфейс обслуживается.
Случай 3. Когда кто-то обращается к моему исходному домену, например subdomain.myorigindomain.com, он должен обслуживать только мое внешнее приложение.
Случай 3: когда кто-то обращается к моему исходному домену, например subdomain.myorigindomain.com, он должен обслуживать только мое внешнее приложение.Случай 3:. р>
Вот что я пробовал:
Код с комментариями ниже:
//app.use(express.static(path.join(__dirname, "/../client/build"))); Добавлено условие, если имя хоста совпадает с источником, а затем перенаправить во внешний интерфейс и отправить index.html по маршруту *, как показано ниже. :
app.get("*", async (req, res) => { res.setHeader("Контроль доступа-Разрешить-Origin", "*"); пытаться { вар realUrl = (req.connection.encrypted ? «https» : «http») + «://» + req.headers.host + req.url; const Url = url.parse(realUrl, true); Url.remoteAddress = req.header("x-forwarded-for") || req.connection.remoteAddress; if (Url.hostname === 'subdomain.myorigindomain.com' && (Url.pathname === '/' || Url.pathname === '/admin')) { /** * Я попробовал ниже, попробовал все нижеперечисленные вещи * Способ 1: return res.sendFile(path.join(__dirname + "/../client/build/index.html")); * Способ 2: * res.set("location", `${configTable.origin}/admin`); * res.set("Cache-Control", "no-store"); * return res.status(301).send(); * Способ 3: return res.redirect(`${configTable.origin}/admin`) * Метод 4: app.use(express.static(path.join(__dirname, "/../client/build"))); */ } Но ничего не помогло.
Как я могу решить эту проблему?
Мобильная версия