.htaccess маршрутизация на стороне сервера и перенаправления среды узла

У меня есть веб-приложение React с сервером Node.js, файл .htaccess моего веб-сайта, используемый для перенаправления запросов веб-страниц на index.html, однако это означало, что электронные письма, отправляемые из форм на сайте, не доставлялись, поскольку запросы должны были быть перенаправлены в среду Node. Это было исправлено путем перенаправления запросов в среду узла вместо index.html внутри моего файла .htaccess, однако это означает, что моя маршрутизация на стороне сервера теперь сломалась, и теперь я получаю ошибку Cannot GET /end-point всякий раз, когда я ввожу URL-адрес с концом- точку в окне браузера или если я обновлю страницу.

старый .htaccess:

RewriteBase /
RewriteRule ^index\.html$ - [L]
 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.html [L]

текущий .htaccess:

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Есть ли исправление без нарушения маршрутизации на стороне сервера или доставки электронной почты?

Редактировать:

сервер.js:

const express = require("express");
const app = express();
require("dotenv").config({path: "../.env"});
const bodyParser = require("body-parser");
const cors = require("cors");
const nodemailer = require("nodemailer");
var sgTransport = require('nodemailer-sendgrid-transport');
const multer = require("multer");

app.use(express.urlencoded({extended: true}));
app.use(express.json());

app.use(cors());

const transport = nodemailer.createTransport(sgTransport({
  auth: {
    api_key: process.env.SG_API_KEY
  }
}));

app.post("/send_schools_form", cors(), async (req, res) => {
  let {
    school,
    address,
    name,
    phone,
    email,
    substitutes
  } = req.body;

  var substitutesList = substitutes.reduce(function(a, b) {
  return a + '</br><ul><li>Startdatum: ' + b.date + '</li><li>Tid: ' + b.time + '</li>    <li>Info: ' + b.info + '</li></ul>';
}, '');

  await transport.sendMail({
    from: process.env.USER_SENDER,
    to: process.env.USER_RECEIVER,
    subject: `Vikarie begäran ${school}`,
    html: `
    <ul>
      <li>Skola: ${school}</li>
      <li>Adress: ${address}</li>
      <li>Kontaktperson: ${name}</li>
      <li>Telefon: ${phone}</li>
      <li>E-post: ${email}</li>
    </ul>
    <ul>${substitutesList}</ul>
    `
  }, (err) => {
    if (err) {
      console.info(err);
      res.status(400).send('Error');
    } else {
      res.status(200).send('Success');
    }
  })
});

const upload = multer({
  storage: multer.memoryStorage()
});

let middleware = [
  cors(),
  upload.fields([
    {name: "cvFile", maxCount: 1},
    {name: "otherFile", maxCount: 1}
  ])
];

app.post("/send_substitutes_form", middleware, async (req, res) => {
  let {
    firstName,
    lastName,
    email,
    phone,
    address,
    city,
    postalCode,
    availability
  } = req.body;

  await transport.sendMail({
    from: process.env.USER_SENDER,
    to: process.env.USER_RECEIVER,
    subject: `Arbetsansökan ${firstName} ${lastName}`,
    html: `
    <ul>
      <li>Namn: ${firstName} ${lastName}</li>
      <li>E-post: ${email}</li>
      <li>Telefon: ${phone}</li>
      <li>Adress: ${address}</li>
      <li>Ort: ${city}, ${postalCode}</li>
      <li>Tillgänglighet: ${availability} dagar per vecka</li>
    </ul>
    `,
    attachments: [{
      filename: req.files["cvFile"][0].originalname,
      content: req.files["cvFile"][0].buffer
    },
    {
      filename: req.files["otherFile"][0].originalname,
      content: req.files["otherFile"][0].buffer
    }]
  }, (err) => {
    if (err) {
      console.info(err);
      res.status(400).send('Error');
    } else {
      res.status(200).send('Success');
    }
  })
});

const PORT = process.env.PORT || 4000;

app.listen(PORT, () => {
  console.info("Server is listening on port " + PORT);
});
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
99
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы делаете это неправильно, вы не должны перенаправлять с 301.

Я предполагаю, что вы отправляете электронное письмо по почте с http-запросом на свой бэкэнд, поэтому вам нужно установить для всего вашего бэкэнда определенный путь, например /api. Затем вы можете использовать эти ответы для решения вашей проблемы:

RewriteEngine on

RewriteCond %{REQUEST_URI} ^/api/
RewriteRule (.*) /api/public/index.php [L]

RewriteBase /
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.html [L]

Проверьте это и это

Эй, вы можете прочитать мой отредактированный вопрос, я добавил свой файл server.js. Я отправляю электронные письма с помощью API SendGrid.

random1234 06.01.2023 10:07

Это не имеет значения. ваш вопрос касается apache, а не nodejs и не sendgrid.

yeya 06.01.2023 10:10

Кстати, если вам нужно только отправить электронное письмо, вы можете использовать формы sendgrid и отказаться от сервера sendgrid.com/solutions/email-marketing/signup-forms

yeya 06.01.2023 10:11

Значит, путь /api/public/index.php должен быть путем к моему server.js?

random1234 06.01.2023 10:17

Путь должен быть таким, какой вам нравится. Apache все равно не может выполнять nodejs сам по себе

yeya 06.01.2023 10:24

Простите меня за недостаток знаний, но я практически ничего не знаю о apache или .htaccess, server.js, который вы видите выше, ЯВЛЯЕТСЯ моим бэкэндом, то есть откуда я отправляю электронные письма с помощью API SendGrid. В интерфейсе React.js я сделал формы, которые отправляют fetch() и axios.post() запросы к узлу server.js.

random1234 06.01.2023 10:30

«Вы делаете это неправильно, вы не должны перенаправлять с 301». - «Перенаправление 301» в вопросе OP — это просто каноническое перенаправление HTTP на HTTPS (что правильно) и на самом деле не имеет ничего общего с этим вопросом.

MrWhite 06.01.2023 12:38

Если вас интересует только nodejs, то почему мы вообще говорим о .htaccess? Где вы размещаете свой сайт nodejs? .htaccess не имеет ничего общего с nodejs, если только вы не используете его в качестве обратного прокси-сервера.

yeya 07.01.2023 19:20

@yeya Я никогда не утверждал, что меня волнует только Node.js, я писал, что почти ничего не знаю об Apache или файле .htaccess, поэтому я не могу понять ваши указания. Я пытался объяснить, что мой файл server.js был моим единственным «бэкендом», поскольку вы посоветовали мне поместить мой «бэкэнд» по определенному пути. И чтобы ответить на ваш последний вопрос, сайт размещен на A2hosting.

random1234 11.01.2023 17:51

Обратитесь в службу поддержки a2hosting. Возможно, это поможет вам a2hosting.com/kb/installable-applications/manual-installatio‌​ns/…

yeya 11.01.2023 20:12
Ответ принят как подходящий

Проблема была решена путем добавления этого универсального маршрута в конец моего файла server.js после других маршрутов, которые публикуют запросы на отправку электронных писем.

app.get('*', (req, res) => {
  res.sendFile(path.join(__dirname, '/path/to/index.html'));
});

Таким образом, он будет выполнен только в том случае, если ни один из предыдущих маршрутов не соответствует запросу.

Также не забудьте оператор импорта для path вверху:

const path = require("path");

Другие вопросы по теме