Использование ProxyHTMLURLMap для перенаправления css и js запросов

Использование ProxyHTMLURLMap для перенаправления css и js запросов

У меня уже установлен 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.jsdoes a bunch of require
Я пробовал заменить main.jswith 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-адреса могут быть вычислены произвольными способами, которые анализатор регулярных выражений не сможет найти.

Связанный контент