Ich habe bereits Apache 2.4.19 auf meinem Ubuntu 16.04 installiert und arbeite mit Tomcat. Ich versuche, eine Node-App hinzuzufügen und alle Anfragen für /node umzuleiten anhttp://localhost:3000mit ProxyPass. Meine Node-App lauscht natürlich auf Port 3000.
Es funktioniert sehr gut, meine Anfragen umzuleiten wiehttps://myapi.com/node/foo
Ich habe jedoch Probleme mit der Dokumentation, die mitapidocdie ich statisch in meiner Node-App bereitstelle app.use(express.static('doc'));
. Wenn ich zuhttps://myapi.com/node, es scheint, dass alle URLs wie /vendor/xxx
nicht /locales/xxx
mit /node
einem Präfix versehen wurden. Ich dachte, ProxyHTMLURLMap würde sich darum kümmern, aber ich muss es falsch verwenden.
Hier ist meine /etc/apache2/sites-enabled/000-default.conf (ich habe einige Kommentare entfernt, um sie kürzer zu machen)
<VirtualHost *:443>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
# Tomcat
JkMount /* worker1
# SSL Config
SSLEngine on
SSLCertificateFile /path/to/certificate
SSLCertificateKeyFile /path/to/private.key
SSLCACertificateFile /path/to/intermediate-cert
# Headers
Header always set Access-Control-Allow-Origin "*"
Header always set Access-Control-Allow-Headers "X-Requested-With, Content-Type, Origin, Authorization, Accept, Client-Security-Token, Accept-Encoding"
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PULL"
# Return 200 for all OPTIONS requests
RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ $1 [R=200,L]
# Reverse Proxy to Node
# The part below was supposed to change the relative url to /node/xxx but it does not seem to work
ProxyHTMLURLMap http://localhost:3000 /node
<Location /node>
ProxyPass http://localhost:3000
ProxyPassReverse http://localhost:3000
ProxyHTMLEnable On
SetOutputFilter proxy-html
ProxyHTMLURLMap http://localhost:3000
</Location>
</VirtualHost>
<VirtualHost *:80>
ServerName myapi.com
Redirect / https://myapi.com/
</VirtualHost>
BEARBEITEN
Ich kann es nicht ProxyHTMLExtended On
wie von Andrew Schulman vorgeschlagen verwenden, da dies die Ausgabe von apidoc.js durcheinander bringen würde.
Das index.html
mit apidoc.js generierte hat diese Anweisung ganz am Ende:
<script data-main="main.js" src="vendor/require.min.js"></script>
Dann main.js
führt das eine Reihe von aus. require
Ich habe versucht, das main.js
durch node/main.js
in der Skriptanweisung zu ersetzen, aber dann schlagen die Anforderungen fehl ...
Mir ist auch aufgefallen, dass, wenn ich abfragehttps://myapi/node/index.htmldirekt, alle Dateien scheinen einwandfrei zu laden. Vielleicht konfiguriere ich Apache einfach so, dass /node auf /node/index.html umgeleitet wird
Antwort1
Standardmäßig schreibt mod_proxy_html keine Links in Inline-CSS und Javascript um. Um dies zu aktivieren, müssen Sie Folgendes festlegen ProxyHTMLExtended On
. Siehe dieDokumente.
Das könnte Ihr Problem beheben, aber es betrifft nicht CSS und Javascript, die aus anderen Dateien stammen, anstatt inline eingefügt zu sein. Wenn Sie versuchen möchten, diese auch zu beheben, müssen Sie ein anderes Modul wie mod_sed oder mod_line_edit verwenden. Das könnte auch für Sie funktionieren, aber es kann auch unmöglich sein, es vollständig richtig zu machen, da URLs im Code (d. h. Javascript) auf beliebige Weise berechnet werden können, die ein Regex-Parser nicht finden kann.