title: How to force server side serving of a route
body: <p>I'm using passport-js with react-starter-kit and universal router, and there are some /login routes that are handled server side.  Is there any way to force a server side fetch from a route url rather than a client-side one?</p>
  
  <p>For instance, if I go to /logout directly from the url - it triggers the correct server side logout.  However, if I click on a /logout link on the browser from the client-side I get a page not found error because it's doing the client-side routing and /logout is not defined in routes.  Is it possible to define a route object that has to get served directly from the server?</p>
  
  <p>routes/index.js</p>
  
  <pre><code>export default {
  
    path: '/',
  
    // Keep in mind, routes are evaluated in order
    children: [
      require('./home').default,
      require('./contact').default,
      require('./register').default,
      require('./termsOfUse').default,
      require('./privacyPolicy').default,
      require('./invites').default,
      require('./collection').default,
      require('./profile').default,
      require('./content').default,
      require('./notFound').default,
      // Wildcard routes, e.g. { path: '*', ... } (must go last)
    ],
  
    async action({ next }) {
      // Execute each child route until one of them return the result
      const route = await next();
  
      // Provide default values for title, description etc.
      route.title = `${route.title}`;
      route.description = route.description || '';
  
      return route;
    },
  
  };
  </code></pre>
  
  <p>client.js</p>
  
  <pre><code>sync function onLocationChange(location) {
    // my workaround is to put a special case for login and logout
    // but it feels a bit of a hack since this logic should be set in the routing
    // config if possible
    if (location.pathname === '/login' || location.pathname === '/logout') {
      // break - let passport.js handle it via server-side
      window.location.reload();
      return;
    }
  
    ...
    currentLocation = location;
  
    try {
      // Traverses the list of routes in the order they are defined until
      // it finds the first route that matches provided URL path string
      // and whose action method returns anything other than `undefined`.
      const route = await UniversalRouter.resolve(routes, {
        ...context,
        path: location.pathname,
        query: queryString.parse(location.search),
      });
  
      // Prevent multiple page renders during the routing process
      if (currentLocation.key !== location.key) {
        return;
      }
  
      if (route.redirect) {
        history.replace(route.redirect);
        return;
      }
  
      const component = (
        &lt;App context={context}&gt;
          &lt;ApolloProvider client={context.client} store={context.store}&gt;
            {route.component}
          &lt;/ApolloProvider&gt;
        &lt;/App&gt;
      );
  
      appInstance = ReactDOM.render(
        component,
        container,
        () =&gt; onRenderComplete(route, location),
      );
    } catch (error) {
      console.error(error); // eslint-disable-line no-console
  
      // Current url has been changed during navigation process, do nothing
      if (currentLocation.key !== location.key) {
        return;
      }
  
      // Display the error in full-screen for development mode
      if (process.env.NODE_ENV !== 'production') {
        appInstance = null;
        document.title = `Error: ${error.message}`;
        ReactDOM.render(&lt;ErrorReporter error={error} /&gt;, container);
        return;
      }
  
      // Avoid broken navigation in production mode by a full page reload on error
      window.location.reload();
    }
  }
  </code></pre>