2016-09-13 5 views
0

ich Apache auf einem Linux-Server ausgeführt wird und dass meine node.js Apps Routing nicht richtig funktioniert, wenn URLS verwenden, die durch Apache gehen.Node.js Routing mit Apache Proxy

Ich folgte Anweisungen auf anderen Stellen für die auf der Proxy-Module in Apache drehen und dann diese Definition ein:

ProxyPass /testauth http://localhost:3000/ 

(Ich hatte auch eine Linie in ein ähnliches Reverse-Proxy zu definieren, die nichts taten)

Mein Knoten App läuft auf Port 3000 mit Routing wie in app.js

einrichten
app.use('/', routes); 
app.use('/tests', tests); 
app.use('/questions', questions); 

Wenn ich URLs auf meinem Server wie folgt zugreifen:

http://rose.cs.umass.edu:3000/ 
http://rose.cs.umass.edu:3000/questions/179 

ich korrekte Ergebnisse (das Styling mit einigen einfachen CSS beachten) Wenn ich versuche, durch Apache zugreifen wie folgt aus:

http://rose.cs.umass.edu/testauth/questions/179

Ich erhalte einen 404-Fehler, sondern sehen aus der Backtrace dass es in meinem Js-Code ist.
Aus irgendeinem Grund die URL http://rose.cs.umass.edu/testauth teilweise funktioniert (aber CSS angewendet bekommen nicht (weil die index.ejs Datei die CSS wie folgt enthält:

<link rel='stylesheet' href='/stylesheets/style.css' /> 

Die Lage von CSS-Dateien und die Codierung von relativen Pfaden folgt alle node.js Beispiele, die ich geschaut haben und arbeitet in meiner Entwicklungsumgebung in Ordnung. Aber wenn, indem Sie durch Apache die App ausgeführt wird, die Dinge funktionieren nicht richtig. gibt es eine Lösung für das Apache-Konfiguration? Muss ich eine machen müssen Anpassung, wie Codepfade in dem meinem Javascript und EJS-Dateien?

+0

Sicherlich 'http: // localhost/3000 /' sollte stattdessen sein 'http : // localhost: 3000/'? Auch in Bezug auf eine Semi-bezogene Anmerkung könnten Sie mit etwas anderer Software besser umgehen als mit Apache, wenn Sie wirklich etwas vor dem Knoten haben wollen, da Apache überhaupt nicht gut skaliert (mehr oder weniger negiert die Leistungsmerkmale des Knotens). – mscdex

+0

Korrekt. Ich habe die Post repariert. Leistung ist hier nicht wirklich ein Problem. Die Knoten-App ist eine schnelle und schmutzige einmalige – dam

Antwort

0

Ich beschloss, die JSP $ {} pagecontext Idee

Ich rief config.js Datei hinzugefügt zu imitieren, die verschiedenen Einstellungen, die auf bestimmte, wo die app (Sachen wie db-Anmeldeinformationen, usw.) ausgeführt wird. Ich fügte hinzu,

// uncomment the line that applies 
config.pageContext = "" // dev environment 
// config.pageContext = "testauth" // production environment 

Meine Routing-Skripte alle tun so etwas wie:

res.render('questions', {pageContext: util.pageContext(req), questions: questionArray}); 

Und der EJS-Vorlagen haben alle Sachen wie diese in den URLS:

<script src="<%= pageContext %>/static/js/bootstrap.min.js"></script> 

Eine zweite Alternative, die ich verwendet für eine Weile, bis ich mit dem oben genannten ging:

Übergeben Sie ein Argument an Ihre Knoten App, wenn Sie starten es. Sie setzen dann eine globale Variable ähnlich wie oben und verwenden sie ähnlich. Wenn Sie einen Prozess-Manager verwenden (I PM2 verwenden) Ihren Knoten-App auf Ihrem Server laufen müssen Sie vielleicht so etwas wie:

pm2 start testauth -- -c /testauth // start testauth.bin using /testauth for the page context 
1

Einen Anhaltspunkt ich hatte, was falsch war, ist, dass Knoten der Pfade ea wurden Druck ch Zeit kam eine Anfrage in und sie sahen aus wie

GET //questions/ 404 4.278 ms - 916 

Also änderte ich Apache zu haben:

ProxyPass /testauth http://localhost:3000 (removed trailing slash) 

Jetzt sind die Wege in meine Anwendung kamen richtig gebildet.

Der nächste Auftrag des Geschäfts ist es, all relativen URLs in meinen EJS-Vorlagen, die clientseitige JavaScript zu überarbeiten, und leitet auch in der Server-Seite.

Da ich "testauth" in den Pfad setzen musste, damit Apache zum Knoten weiterleiten kann, haben alle in die App eingehenden URLs die Form rose.cs.umass.edu/testauth/rest-of-url. Dies bedeutet, relativen URLs in meinem app-Code, die

<a href="/questions" ....> 

waren jetzt falsch wie

sahen, weil sie absolute URLs erstellt, die den testauth im Pfad weggelassen. Einige dieser relativen URLs sind jetzt ziemlich merkwürdig (mit Dingen wie ../ oder sogar ../ .. um zu Dingen zu kommen). Ich wünschte, es gäbe eine Variable ähnlich $ {pageContext.request.contextPath}, die ich in JSP verwende, um URLs zu erstellen.

+0

Ich bin mit dem gleichen Problem konfrontiert. Hast du einen Weg gefunden, dies zu tun? – smaira