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

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

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

например

www.myapp.com/sitemap.xml
www.myapp.com/something.html

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

Любое решение, чтобы оно работало постоянно. Благодаря.

Изменить

Я использую сервер Apache, который настроен на перенаправление всех запросов в index.html, я думаю, что это причина такого поведения. Это моя конфигурация, но я не знаю, как это исправить.

Options -MultiViews
RewriteEngine On

RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.html [QSA,L]

Обновление Я попробовал решение, предложенное в ответе.

мои маршруты выглядят так: для чего-то. я загружаю компонент ServerLoad

<Switch>
    <Route exact path="/" component={Home} />
    <Route path="/about" component={About} />
    <Route path="/about" component={About} />
    <Route path="something.html" component={ServerLoad} />
    <Route component={NoMatch} />
</Switch>

В компоненте ServerLoad функция componentDidMount я сделал это. Но это не работает.

componentDidMount() {
    window.location.reload(true);
}

Больше Я настроил этот проект с помощью create-реагировать на приложение и обслуживать его на экспресс-сервере (как это). Я не уверен, если мне нужно сделать некоторые настройки для сервера других статических файлов.

4b9b3361

Ответ 1

Это должно работать:

const reload = () => window.location.reload();

<Router>
  // all your routes..
  ...

  // Your special routes..
  <Route path="/sitemap.xml" onEnter={reload} />
  <Route path="/something.html" onEnter={reload} />
</Router>

Итак, я думаю, это должно быть довольно ясно, что он делает;)

Обновление:

если это опция, вы можете просто добавить атрибут target = "_ blank" в <Link>

IMHO это с точки зрения UX еще лучше, потому что, если эти маршруты не являются частью вашего основного приложения, пользователь может просто переключить Tab после посещения этих специальных страниц.

Ответ 2

Это нежелательное поведение ServiceWorker.js использует комментарий ниже и меняет его в index.js вашего React proyect, и он должен работать

import { unregister } from './registerServiceWorker';
unregister();

https://github.com/facebookincubator/create-react-app/issues/2715

Ответ 3

Используйте Switch в сочетании с компонентом NoMatch сочетании с решением webdeb:

<Router>
  <div>
    <Switch>
      <Route exact path="/" component={Home} />
      <Route exact path="/admin" component={Admin} />
      <Route component={NoMatch} />
      <Route onEnter={() => window.location.reload()} />
    </Switch>
  </div>
</Router>

Это будет соответствовать маршрутам, покажет 404, если не существует действительного href, и покажет файл или что-то, если это допустимый href.

Ответ 4

Если страницы вообще не связаны с приложением Reactjs (т.е. С использованием другого каталога), я думаю, что мы можем направить его со слоя Node, используя следующий код, чтобы структура была более интуитивной:

app.use('/url_to_static_pages', express.static('path_to_static_files'));

Ответ 5

Если вам нужно /terms для перенаправления на /terms.html, приведенный ниже код сработал для меня с Reaction-router 3.x.

const reload = () => window.location.reload();
<Router>
  <Switch>
    <Route exact path="/" component={Home} />                
    <Route path="/terms.html" render={reload} />
    <Route path="/privacy.html" render={reload} />
    <Route path="/terms" render={() => <Redirect
        to={{
          pathname: "/terms.html"
        }}
      />} 
    />
    <Route path="/privacy" render={() => <Redirect
        to={{
          pathname: "/privacy.html"
        }}
      />} 
    />
  </Switch>
</Router>