создать-реагировать-приложение | Можно ли обслуживать файл из бэкэнда вместо обслуживания index.html, когда браузер подключается к приложению

Я пытался включить SSL в своем приложении MERN, развернутом на heroku.
Я застрял на этом шаге гораздо больше, чем необходимо:


Я следую этому руководству по для настройки SSL-сертификата на моем веб-сайте.
После создания сертификата с помощью этой команды локально:

sudo certbot точно --manual

Меня попросил сделать это терминал:

Создайте файл, содержащий только эти данные:

dC9Ry5Ps_qgkOheuWnxCXFobim8vshqMqbDC9FQS4ic.noFTXhkC3HFnZ-RC9djrM6FpWGRy2AFSB17xz59apDA

И сделайте его доступным на вашем веб-сервере по этому URL-адресу:

http://www.site_name.com/.well-known/acme-challenge/dC9Ry5Ps_qgkOheuWnxCXFobim8vshqMqbDC9FQS4ic

Согласно учебнику, я должен был сделать это на бэкэнде:

app.get('/.well-known/acme-challenge/:content', function(req, res) {
  res.send('xxxxxxxxxxxx-yyyy.zzzzzzzzzzzzzzzzzzz')
})

Я сделал это, и, как и ожидалось, это не сработало, поскольку certbot будет нацелен на внешний интерфейс, а не на серверный:

Создайте файл, содержащий только эти данные:

dC9Ry5Ps_qgkOheuWnxCXFobim8vshqMqbDC9FQS4ic.noFTXhkC3HFnZ-RC9djrM6FpWGRy2AFSB17xz59apDA

И сделайте его доступным на вашем веб-сервере по этому URL-адресу:

http://www.site_name.com/.well-known/acme-challenge/dC9Ry5Ps_qgkOheuWnxCXFobim8vshqMqbDC9FQS4ic

И мне просто не имеет смысла делать эти данные доступными

dC9Ry5Ps_qgkOheuWnxCXFobim8vshqMqbDC9FQS4ic.noFTXhkC3HFnZ-RC9djrM6FpWGRy2AFSB17xz59apDA

на стороне клиента.
Итак, мой вопрос: должен ли он быть доступен на стороне клиента или на стороне сервера? Это на стороне сервера, должен ли я просто написать код на стороне клиента, который будет связываться с сервером, чтобы получить его?


Итак, когда происходит процесс проверки, и он пытается получить доступ к конечной точке бэкэнда через это:

http://www.site_name.com/.well-known/acme-challenge/dC9Ry5Ps_qgkOheuWnxCXFobim8vshqMqbDC9FQS4ic

Приложение рассматривает это как попытку доступа к файлу на стороне клиента...
Другими словами, я не могу настроить таргетинг на серверную конечную точку.
Все руководства игнорируются этот момент, и это заставляет меня чувствовать, что я что-то упускаю или что я глуп.

Итак, есть идеи, что мне делать?


У этого парня похоже, та же проблема, что и у меня, но нет ответа был предоставлен.


person AG_HIHI    schedule 08.11.2020    source источник


Ответы (2)


Это то, что я делаю для своего собственного приложения MERN Stack, и это работает, кроме того, я всегда развертываю свои проекты на героку.

Первое, что я делаю, я сначала генерирую свой SSL-сертификат и ключ, используя: --› openssl

  • Это команда, которую вы хотели бы запустить: openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365
  • Эта команда создаст вам два файла cert.perm и key.pem

Пришло время настроить https вашего сервера

const app = require('express')();
const https = require('https');
const fs = require('fs');

//GET home route
app.get('/', (req, res) => {
    res.send('Hello World');
});

// we will pass our 'app' to 'https' server
https.createServer({
    key: fs.readFileSync('./key.pem'),
    cert: fs.readFileSync('./cert.pem'),

}, app).listen(3000);
  • Принимая во внимание соглашение, вы также можете подключить сервер http, выполнив то же самое, что и http.createServer, и все, что вам нужно сделать, это передать express app.
  • Однако, если есть определенные вещи, которые вы хотите ограничить для http, вы можете отделить их от использования одного и того же экспресс-приложения. Надеюсь, это имеет смысл.
person Ntshembo Hlongwane    schedule 08.11.2020

Я нашел решение: обслуживание статического файла из бэкэнда.

  1. Создайте файл в корневой папке (root_folder/sec/ssl), содержащий код:
    введите здесь описание изображения

2. Добавьте это в свой экспресс-маршрутизатор:


// Server static assets if in production
// Check if we are in production
if (process.env.NODE_ENV === "production") {
  // Set static folder
  app.use(express.static("client/build"));
  // We want to get anything that is not one of those api routes
  /********************************** */
  /***Adding the certbot verification code */
  /********************************** */
  app.get(
    "/.well-known/acme-challenge/url_code",
    (req, res) => {
      console.log(
        "get(/.well-known/acme-challenge/ur_code)"
      );
      // __dirname is the current directory name
      //We will tell the server if none of those routes are being hit then look into the build folder index.html
      res.sendFile(path.resolve(__dirname, "sec", "ssl"));
    }
  );
  /*********************************** */
  app.get("*", (req, res) => {
    // __dirname is the current directory name
    //We will tell the server if none of those routes are being hit then look into the build folder index.html
    res.sendFile(path.resolve(__dirname, "client", "build", "index.html"));
  });
}

Вот и все!

person AG_HIHI    schedule 09.11.2020