У меня уже установлен apache 2.4.19 на моем Ubuntu 16.04, работающий с Tomcat. Я пытаюсь добавить приложение node и перенаправить все запросы для /node наhttp://localhost:3000с ProxyPass. Мое приложение node, конечно, слушает порт 3000.
Он отлично работает для перенаправления таких запросов, какhttps://myapi.com/node/foo
Однако у меня возникли проблемы с документацией, созданной с помощьюапидоккоторый я обслуживаю статически в моем приложении node с app.use(express.static('doc'));
. Когда я иду вhttps://myapi.com/node, похоже, что все URL-адреса типа /vendor/xxx
, /locales/xxx
не получили /node
префикс. Я думал, что ProxyHTMLURLMap позаботится об этом, но, должно быть, я неправильно его использую.
Вот мой /etc/apache2/sites-enabled/000-default.conf (я удалил некоторые комментарии, чтобы сделать его короче)
<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>
РЕДАКТИРОВАТЬ
Я не могу использовать ProxyHTMLExtended On
то, что предлагает Эндрю Шульман, потому что это испортит вывод apidoc.js.
Сгенерированный index.html
с помощью apidoc.js имеет этот оператор в самом конце:
<script data-main="main.js" src="vendor/require.min.js"></script>
Затем main.js
does a bunch of require
Я пробовал заменить main.js
with node/main.js
в операторе script, но тогда require не срабатывает...
Я также заметил, что если я запрашиваюhttps://myapi/node/index.htmlнапрямую, все файлы, кажется, загружаются нормально. Может быть, я просто настрою Apache для перенаправления /node на /node/index.html
решение1
По умолчанию mod_proxy_html не перезаписывает ссылки в встроенном CSS и Javascript. Чтобы включить это, нужно установить ProxyHTMLExtended On
. См.документы.
Это может решить вашу проблему, но это не касается CSS и Javascript, которые берутся из других файлов, а не включаются в строку. Если вы хотите попытаться исправить и их, вам нужно будет использовать другой модуль, такой как mod_sed или mod_line_edit. Это также может сработать для вас, но также может быть невозможно сделать все правильно, поскольку в коде (т. е. Javascript) URL-адреса могут быть вычислены произвольными способами, которые анализатор регулярных выражений не сможет найти.