Я использую экспресс для обслуживания статических файлов на моем VPS. Я создал два сервера http и https примерно так:

var httpServer = http.createServer(app);
httpServer.listen(httpPort);

var httpsServer = https.createServer(credentials, app);
httpsServer.listen(httpsPort);

Используя промежуточную одежду, как показано ниже:

app.use(function (req, res, next) { 
    !req.secure 
        ? res.redirect(301, path.join('https://', req.get('Host'), req.url)) 
        : next();
});

Большинство моих запросов хорошо перенаправлены на https. Однако при загрузке моего сайта только с доменом без ssl (http://example.com) и без каких-либо дочерних маршрутов (например, http://example.com/contact), это не перенаправление на https.

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

Я обслуживаю статические файлы (угловое приложение, скомпилированное для производства):

app.use(express.static(path.join(__dirname, distFolder)));

И у меня есть маршрут, который следует:

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

Можете ли вы помочь мне узнать, что я пропустил? Я не нашел ответа на этот вопрос.

Спасибо.

0
Alteyss 3 Сен 2017 в 17:33

4 ответа

Лучший ответ

Наконец-то я выяснил, в чем заключалась проблема: я проходил проверку безопасности в общей папке перед ...

Итак, вот шаги сейчас:

// Step 1: Test all incoming requests (from http and https servers).

app.use(function (req, res, next) {
    if (req.secure) 
        return next();

    var target = url.format({ // Thanks Linus for the advice!
        protocol: 'https:',
        host: req.hostname,
        pathname: req.url
    });

    res.redirect(301, target);
});

// Step 2: Serve static files.

app.use(express.static(path.join(__dirname, 'your/dist/folder')));

// Step 3: Build routes (in my case with * because of the SPA).

app.get('*', function (req, res) {
    res.sendFile(path.join(__dirname, 'your/dist/folder', 'index.html'));
});

Теперь это работает отлично!

1
Alteyss 5 Сен 2017 в 04:33

Я посоветую вам попробовать это на уровне веб-сервера, а не на уровне приложений, получать как защищенные, так и незащищенные запросы / трафик через 80 и 443.

0
ajafik 3 Сен 2017 в 14:55

Мы также можем использовать node-rest-client для правильного перенаправления на любой URL.

Вы можете установить его npm install node-rest-client

2
user8555165 3 Сен 2017 в 15:03

path.join предназначен для объединения элементов пути и не должен использоваться для создания URL-адресов. В вашем примере в URL перенаправления будет отсутствовать одна из ведущих косых черт.

> path.join('https://', 'example.com', '/hello/world')
'https:/example.com/hello/world'

Вместо этого вы можете использовать url.format, который создаст правильный URL.

> url.format({ protocol: 'https:', host: 'example.com', pathname: '/hello/world' })
'https://example.com/hello/world'

Ваш код будет выглядеть примерно так:

app.use(function (req, res, next) {
  if (req.secure) return next()

  const target = url.format({
    protocol: 'https:',
    host: req.get('Host'),
    pathname: req.url
  })

  res.redirect(301, target)
})
1
Linus Unnebäck 3 Сен 2017 в 19:24