Какой статус HTTP я должен использовать для отправки страницы 404? - PullRequest
1 голос
/ 09 мая 2020

У меня есть одностраничное приложение, в котором вся маршрутизация выполняется на клиенте с использованием react-router-dom.

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

Для любого маршрута из этого набора он будет считаться недействительным, и клиентский код перенаправит вас на маршрут /404-page.

Итак, Мне нужно сделать то же самое, когда Я выполняю рендеринг на сервере.

Это поток:

  • Вы попросите мой сервер /invalid-route
  • Мой код из react-router отобразит <Redirect to="/404-page"/>
  • Мне нужно будет перенаправить ваш запрос на /404-page
  • Какой код мне следует использовать для этого перенаправления?

Думаю, мне следует установить status = 404. Потому что этот маршрут не был найден, верно?

Что-то вроде:

// YOU'VE REQUESTED SOME /invalid-route

res.status(404).redirect(ROUTES.NOT_FOUND);

Но теперь вы спросите у моего сервера маршрут /404-page. Что на самом деле отобразит 404 Page

  • Вы запрашиваете /404-page
  • Мой сервер отобразит для вас страницу 404.
  • Какой код состояния мне следует использовать для страницы 404?

Следует ли мне использовать 200 Ok? Поскольку мой /404-page является действующим и существующим URL-адресом, который фактически что-то отображает?

// NOW YOU ARE REQUESTING MY /404-page

res.status(200).send( // 404 PAGE HTML );

Это правильный способ сделать это?


ОБНОВЛЕНИЕ:

Мой вопрос предполагал что-то не так.

Когда пользователь запрашивает /invalid-url, вы не можете отправить 404 и перенаправить одновременно.

Потому что следующий код:

// YOU'VE REQUESTED SOME /invalid-route

res.status(404).redirect(ROUTES.NOT_FOUND);

// NOW YOU ARE REQUESTING MY /404-page

res.status(200).send( // 404 PAGE HTML );

Получил следующий результат:

[! [Введите описание изображения здесь] [1]] [1]

перенаправление было выполнено с использованием 302, хотя я использовал res.status(404)..

Это вообще не предназначено. Потому что статус 404 не был отправлен.

Итак, я думаю, мы должны перенаправить /invalid-route с помощью 302 или 301 и отправить 404 для /404-page

Что-то вроде:

// YOU'VE REQUESTED SOME /invalid-route

res.status(302).redirect(ROUTES.NOT_FOUND);

// NOW YOU ARE REQUESTING MY /404-page

res.status(404).send( // 404 PAGE HTML );

UPDATE 2:

Это не работает, как предполагалось, чтобы отправить 301

// THIS SENDS A 302, EVEN THOUGH SETTING 301

res.status(301).redirect(ROUTES.NOT_FOUND);

Чтобы отправить 301 на перенаправление, мне пришлось сделать:

// THIS SYNTAX ALLOWS YOU TO CHOOSE THE STATUS CODE FOR THE REDIRECT

res.redirect(301,ROUTES.NOT_FOUND);
``´


  [1]: https://i.stack.imgur.com/jNnfN.png

1 Ответ

1 голос
/ 09 мая 2020

Моя интуиция говорит, что страница 404 всегда должна возвращать статус 404. Если он поставляется с реальной страницей для отображения этого сообщения 404, тогда ничего страшного. Это то, что я считаю интуитивно понятным.

Это моя мысленная картина для этого потока запросов:

  1. Client GET / invalid-route -> Server
  2. Server 404 <Redirect to="/404-page"/> -> Клиент
  3. Клиент GET / 404-страница -> Сервер
  4. Сервер 404/404-страница -> Клиент

Думаю, возникает путаница от восприятия страницы 404 как существующего ресурса, который должен возвращать 200 по запросу. Я предпочитаю думать о странице 404 как о меньше странице и больше о коде состояния 404 с некоторым человеческим редактором html для визуализации кода.

...