2015-08-19 33 views
16

Ich bin bereit, React-Router für meine Anwendung zu verwenden, und ich versuche zuerst, die ich unten kopiert. Wenn ich nun zu localhost:3000/ gehe, sehe ich "App" wie erwartet, aber jede andere Seite, wie localhost:3000/inbox gibt "Can not GET/inbox" zurück. Was fehlt mir hier?React-Router "Kann nicht GET/*" außer Root-URL

var About = React.createClass({ 
    render: function() { 
    return <h2>About</h2>; 
}}); 

var Inbox = React.createClass({ 
    render: function() { 
    return <h2>Inbox</h2>; 
}}); 

var App = React.createClass({ 
    render() { 
    return (
     <div><h1>App</h1> 
     <RouteHandler/> 
     </div> 
)}}); 

var routes = (
    <Route path='/' handler={App}> 
    <Route path="about" handler={About}/> 
    <Route path="inbox" handler={Inbox}/> 
    </Route> 
); 

Antwort

13

Ich glaube, das Problem ist, dass Sie eine http Ressourcenanfrage machen:

GET /inbox HTTP/1.1 
Host: localhost:3000 

aber verwenden clientseitige nur Routing. Möchten Sie auch serverseitig rendern? Möglicherweise müssen Sie den Routerstandort auf HistoryLocation anstelle von HashLocation (Standardeinstellung) ändern.

Die Standort-Prop von sagt es, wo die Routen gegen übereinstimmen. Wenn Sie nicht auf der Serverseite React arbeiten, müssen Sie Router.HashLocation verwenden (oder einfach leer lassen).

Wenn nicht, greifen Sie falsch auf Ihre Komponente zu. Versuchen Sie es mit http://localhost:3000/#/inbox. Es kann etwas dauern, sich mit React-Router vertraut zu machen, aber es lohnt sich auf jeden Fall!

React Router Documentation - HashLocation

+0

Danke für Ihre Antwort. Ich rufe 'Router.run (routes, Router.HistoryLocation, function (Handler, state) {...}', ich weiß nichts über HashLocation. Alles was ich brauche, ist ein anderer Text, der angezeigt wird, abhängig vom Namen, den ich hinzufüge nach dem '/' (zum Beispiel '/ inbox'). Das/#/gibt das gleiche zurück, was auch immer ich hinter es gesetzt habe (dh '/ #/inbox' wird genauso behandelt wie '/' und zeigt 'App' an: 'state.params' ist ein leeres Objekt) – JulienD

+0

Läuft React auf dem Server? Oder mounten Sie gerade React in einer einfachen index.html Datei? –

+0

Ich habe eine Apache Instanz, die mein Frontend bei localhost: 3000 und Die index.html enthält dort den React.js-Code, wenn es Sinn macht, ich habe auch ein Python-Backend bei: 8000, aber ich nehme an, es ist nicht verwandt. – JulienD

39

Wenn Sie webpack-dev-server verwenden es eine Option history-api-fallback genannt wird. Wenn der Wert true ist, wird 404s auf /index.html zurückgesetzt.

Fügen Sie die Option devServer Abschnitt der Webpack Config wie folgt aus:

devServer: { 
    contentBase: 'app/ui/www', 
    devtool: 'eval', 
    hot: true, 
    inline: true, 
    port: 3000, 
    outputPath: buildPath, 
    historyApiFallback: true, 
}, 

Link zu Webpack docs: https://webpack.github.io/docs/webpack-dev-server.html

+1

Dies sollte die validierte Antwort sein! Vielen Dank ! –

+1

Das ist eine richtige Lösung für die Frage – Dipesh

+0

Danke, das ist die Antwort! – Honza

0

Die Anfrage wird an den Server gesendet werden, und das Verzeichnis/Datei nicht existiert wirklich, so wird es 404 zurückgeben, also müssen Sie dem Server mitteilen, dass er die Indexseite für alle Anfragen zurückgibt, und reactive wird das Rooten behandeln:

Wenn Sie wie ich, hosten Sie Ihre Reaction-App auf IIS, jus t fügen Sie eine web.config-Datei enthält:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <system.webServer> 
    <httpErrors errorMode="Custom" existingResponse="Replace"> 
     <remove statusCode="404" subStatusCode="-1" /> 
     <error statusCode="404" path="/" responseMode="ExecuteURL" /> 
    </httpErrors> 
    </system.webServer> 
</configuration> 

Diese IIS-Server anweisen, die Haupt-Seite an den Client statt 404-Fehler zurück.

Verwandte Themen