5

У меня есть среагировать-маршрутизатор 3.0.0 установки с компонентом NotFound я показываю как запасной вариант:Отправить как 404 статус и перенаправлять 404 компонента в среагировать-маршрутизатор

<Route component={NotFound} path="*"/> 

Однако это возвращает редирект и искатель Google жалуется на soft 404s. Могу ли я переадресовать на мой компонент NotFound и отправить 404, как это делает Github? Я попробовал следующее предложение здесь: How to let react router respond with 404 status code?

<Route component={NotFound} path="*" status={404}/> 

Но это просто дает мне 404 без отображения компонента.

Как можно выполнить вышеуказанное?

+2

Если вы хотите вернуть статус HTTP 404, вам нужно будет сделать это с сервера. Для этого вы можете использовать 'match'. Если совпадение не удастся, вы можете вернуть статус 404 в ответ. http://knowbody.github.io/react-router-docs/api/match.html – jstwrt

+1

Проверьте другой ответ в том же вопросе, который вы связали. http://stackoverflow.com/a/36075450/2030321 Taion на самом деле является одним из разработчиков, стоящих за [tag: response-router] (и некоторые другие библиотеки тоже). В значительной степени и то, что сказал @cheersjosh. Это должно произойти и с сервера. – Chris

+0

Хорошо, спасибо. Хотя я не делаю рендеринг на стороне сервера, и надеялся, что может быть быстрое решение, подобное тому, которое я пробовал. – paqash

ответ

0

Просто, чтобы закрыть петлю на этом - я не хотел идти по пути рендеринга на стороне сервера, поэтому я реализовал следующий в моем глобальном обработчике ошибок промежуточного слое:

 if (err.name === 'UnauthorizedError') { 
     res.status(401).send(prepareErrorResponse(isXhr, 'Acess Denied')); 
     } else if (err.status === 404) { 
     res.status(404).send(prepareErrorResponse(isXhr, 'Not Found')); 
     if (req.accepts('html')) { 
     // Respond with html page. 
     fs.readFile(__dirname + '/../404.html'), 'utf-8', function(err, page) { 
      res.writeHead(404, {'Content-Type': 'text/html'}); 
      res.write(page); 
      res.end(); 
     }); 
     } else { 
     if (req.accepts('json')) { 
      // Respond with json. 
      res.status(404).send({ error: 'Not found' }); 
     } else { 
      // Default to plain-text. send() 
      res.status(404).type('txt').send('Not found'); 
     } 
     } 
    } 

В принципе, вместо показывая NotFound Компонент на клиенте (с мягким 404), я обслуживаю страницу NotFound непосредственно с сервера (с статусом 404).

Смежные вопросы