Подтвердить что ты не робот

Как отображать 404, когда URL-адрес не соответствует ни одному маршруту, и когда URL содержит /#/, используя ReactJS

Это мой первый раз, когда я использовал ReactJS и не был моим проектом, однако я пытаюсь перенаправить любые несуществующие маршруты на 404 страницу, которую я сделал. Моя 404 страница в настоящее время отображается так, как предполагалось, когда любой URL-адрес, который не соответствует маршруту, вводится отдельно, когда URL содержит /#/.

Например, этот URL-адрес будет перенаправлен на мою страницу 404:

http://localhost:8080/non-existent-url

Но этот URL-адрес будет загружать только мой маршрут по умолчанию (домашняя страница):

http://localhost:8080/#/non-existent-url

Я не знаю, для чего нужен /#/, и кажется, что приложение отобразит страницы с допустимыми маршрутами с или без него.

Файл с удаленными маршрутами:

import React from "react";
import { Router, Route, IndexRoute, browserHistory, hashHistory, Redirect } from "react-router/es";
import willTransitionTo from "./routerTransition";
import App from "./App";
import DashboardContainer from "./components/Dashboard/DashboardContainer";
import DashboardAccountsOnly from "./components/Dashboard/DashboardAccountsOnly";
import NotFound from './components/NotFound';

const history = __HASH_HISTORY__ ? hashHistory : browserHistory;

class Auth extends React.Component {
    render() {return null; }
}

const routes = (
    <Route path="/" component={App} onEnter={willTransitionTo}>
        <IndexRoute component={DashboardContainer}/>
        <Route path="/auth/:data" component={Auth}/>
        <Route path="/dashboard" component={DashboardContainer}/>

        <Route path='*' exact={true} component={NotFound} />
    </Route>
);

export default class Routes extends React.Component {
    render() {
        return <Router history={history} routes={routes} />;
    }
}

404 (NotFound):

import React from 'react';
import {Link} from "react-router/es";
import Translate from "react-translate-component";

var image = require("assets/404.png");

const NotFound = () =>

    <div className="grid-block main-content wrap regular-padding">
        <div className="grid-content small-12" style={{marginTop:"200px"}}>
            <div style={{ textAlign:"center"}}>
                <img style={{marginBottom:"1.2rem"}} src={image} />
                <h3>404 page not found</h3>
                <p>This page does not exist.</p>
                <Link className="button" to={"/dashboard"}>
                    <Translate style={{color:"#fff"}} content="account.home" />
                </Link>
            </div>
        </div>
    </div>

export default NotFound;

Как перенаправить пользователей на мою страницу 404, если URL-адрес не соответствует маршруту и, когда URL-адрес содержит /#/?

4b9b3361

Ответ 1

Для реактивного маршрутизатора < 4.0

Если вы хотите отобразить страницу с ошибкой и не изменить путь

<Route path='*' exact={true} component={errorcomponent} />

Если вы хотите отобразить страницу с ошибкой и изменить путь

<Route path='/error' component={errorcomponent} />
 // use redirect to  change the Url
<Redirect from='*' to='/error' />

Для реактивного маршрутизатора 4

Сохраните путь

<Switch>
    <Route exact path="/" component={component} />
    <Route component={errorcomponent} />
 </Switch>

изменить Url.

 <Switch>
    <Route path="/comp" component={component} />
   <Redirect to="/error" />
 </Switch>

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

Ответ 2

Основываясь на том, что я вижу в вашем коде, попытка переключения между историей хэша и историей браузера просто не сработает. В тот момент, когда вы нажмете "/#" на все, что он сломает и всегда попадет на ваш общий маршрут "/".

URL-адреса хэшей - это более старый способ обработки вещей, которые больше не должны быть проблемой. См. Этот вопрос SO и его принятый ответ для более подробной информации.

Делать такие ссылки, как Twitter, Hash-Bang #! URL-адрес

Итак, если у вас нет сумасшедшей причины по-прежнему поддерживать хэши в URL-адресах, оставьте историю хэша и просто используйте историю браузера. Тогда ваши маршруты, как определено в вашем предоставленном образце кода, должны работать.

Ответ 3

Вы можете получить доступ к значению location.hash и установить его в пустую.

Но, как уже хорошо описано, это стандартный http в течение многих лет, и вам все равно, за исключением веских причин.

Вы можете видеть это как http://localhost:8080/?non-existent-url, это означает перейти к / с параметром пути non-existent-url, вы тоже хотите перенаправить?

Ответ 4

Существует несколько небезопасных символов, которых следует избегать при создании URL-адреса, один из которых #.

Символ "#" небезопасен и всегда должен быть закодирован, поскольку он используется в World Wide Web и в других системах, чтобы разграничить URL-адрес от фрагмент/якорный идентификатор, который может следовать за ним.

Сервер при разрешении маршрута передаст строку перед #, чтобы получить запрашиваемую страницу, а затем будет перемещен точный фрагмент страницы, если что-то указано с помощью строки после # до любого небезопасного символа.

Итак, в вашей строке перед # пусто, поэтому переадресовываем на /, который является допустимым маршрутом, и перенаправляет его на component App. И поскольку ни один фрагмент не определен, почему ничего не происходит.

Чтобы сделать это, нам нужно сообщить nginx or any other server, чтобы удалить все # перед отправкой запроса вперед.

В этом случае

http://localhost:8080/#/non-existent-url

будет преобразован в,

http://localhost:8080/non-existent-url

Что решит проблему. См. Эту ссылку, чтобы увидеть Как переписать правило в nginx

Ответ 5

Вы можете использовать этот

<Route exact insecure component={NotFound} />

Ответ 6

Проблема заключается в том, что в URL http://localhost:8080/#/non-existent-url маршрут является просто /, поэтому он поражает ваш компонент приложения. Назначение # в стандартном URL-адресе означает переход к местоположению внутри страницы. Поэтому ваш url говорит "перейдите на страницу/и перейдите в это конкретное место после загрузки страницы".

С точки зрения маршрутизации/это ваш маршрут, поэтому он найден. Честно говоря, если вы не выполняете 5-летний стиль маршрутизации хеширования, это ведет себя так, как предполагалось. В этом случае (если вы застряли с людьми, помещенными на эти страницы или что-то еще), чтобы заставить "не найти" что-то подобное, я бы начал переписывать URL.

Приложения SPA уже переписывают входящие URL-адреса на сервере, поэтому все они направлены на одну страницу. Добавьте правило, которое, как часть перезаписи, удаляет # (если вы не используете его в своем приложении).

Итак, http://localhost:8080/#/non-existent-url будет внутренне обрабатываться приложением как http://localhost:8080/non-existent-url.

Ответ 7

вы должны Router компонент как родительский элемент Route и добавить этот маршрут

<Route path='*' component={() => NotFound} />

const routes = (
    <Router>
        <div>
            <Route path="/" component={App} onEnter={willTransitionTo}
            <IndexRoute component={DashboardContainer}/>
            <Route path="/auth/:data" component={Auth}/>
            <Route path="/dashboard" component={DashboardContainer}/>

            <Route path='*' component={() => NotFound} />
        </div>
    </Router>
);