У меня есть веб-приложение 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);
});
Вы делаете это неправильно, вы не должны перенаправлять с 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]
Проверьте это и это
Это не имеет значения. ваш вопрос касается apache, а не nodejs и не sendgrid.
Кстати, если вам нужно только отправить электронное письмо, вы можете использовать формы sendgrid и отказаться от сервера sendgrid.com/solutions/email-marketing/signup-forms
Значит, путь /api/public/index.php
должен быть путем к моему server.js
?
Путь должен быть таким, какой вам нравится. Apache все равно не может выполнять nodejs сам по себе
Простите меня за недостаток знаний, но я практически ничего не знаю о apache
или .htaccess
, server.js
, который вы видите выше, ЯВЛЯЕТСЯ моим бэкэндом, то есть откуда я отправляю электронные письма с помощью API SendGrid. В интерфейсе React.js я сделал формы, которые отправляют fetch()
и axios.post()
запросы к узлу server.js
.
«Вы делаете это неправильно, вы не должны перенаправлять с 301». - «Перенаправление 301» в вопросе OP — это просто каноническое перенаправление HTTP на HTTPS (что правильно) и на самом деле не имеет ничего общего с этим вопросом.
Если вас интересует только nodejs, то почему мы вообще говорим о .htaccess? Где вы размещаете свой сайт nodejs? .htaccess не имеет ничего общего с nodejs, если только вы не используете его в качестве обратного прокси-сервера.
@yeya Я никогда не утверждал, что меня волнует только Node.js, я писал, что почти ничего не знаю об Apache или файле .htaccess
, поэтому я не могу понять ваши указания. Я пытался объяснить, что мой файл server.js
был моим единственным «бэкендом», поскольку вы посоветовали мне поместить мой «бэкэнд» по определенному пути. И чтобы ответить на ваш последний вопрос, сайт размещен на A2hosting.
Обратитесь в службу поддержки a2hosting. Возможно, это поможет вам a2hosting.com/kb/installable-applications/manual-installations/…
Проблема была решена путем добавления этого универсального маршрута в конец моего файла server.js
после других маршрутов, которые публикуют запросы на отправку электронных писем.
app.get('*', (req, res) => {
res.sendFile(path.join(__dirname, '/path/to/index.html'));
});
Таким образом, он будет выполнен только в том случае, если ни один из предыдущих маршрутов не соответствует запросу.
Также не забудьте оператор импорта для path
вверху:
const path = require("path");
Эй, вы можете прочитать мой отредактированный вопрос, я добавил свой файл
server.js
. Я отправляю электронные письма с помощью API SendGrid.