ProxyHTMLURLMap을 사용하여 CSS 및 js 요청 리디렉션

ProxyHTMLURLMap을 사용하여 CSS 및 js 요청 리디렉션

Tomcat과 함께 작동하는 Ubuntu 16.04에 이미 Apache 2.4.19가 설치되어 있습니다. 노드 앱을 추가하고 /node에 대한 모든 요청을 다음으로 리디렉션하려고 합니다.http://localhost:3000ProxyPass로. 내 노드 앱은 물론 포트 3000을 수신하고 있습니다.

다음과 같은 요청을 리디렉션하는 데 매우 효과적입니다.https://myapi.com/node/foo

그러나 생성된 문서에 문제가 있습니다.아피독내 노드 앱에서 정적으로 제공됩니다 app.use(express.static('doc'));. 내가 갈 때https://myapi.com/node/vendor/xxx, 과 같은 모든 URL에는 접두사가 /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>

편집하다
Andrew Schulman이 제안한 대로 사용할 수 없습니다. ProxyHTMLExtended On왜냐하면 apidoc.js의 출력이 엉망이 되기 때문입니다. apidoc.js로
생성 index.html된 파일의 맨 끝에 다음 문장이 있습니다.
<script data-main="main.js" src="vendor/require.min.js"></script>
그런 다음 스크립트 문장에서 를 with로 바꾸려고 시도했습니다 main.js. 그런데 요구 사항이 실패하고 있습니다. 쿼리하면require
main.jsnode/main.js
https://myapi/node/index.html직접적으로 모든 파일이 제대로 로드되는 것 같습니다. 어쩌면 /node를 /node/index.html로 리디렉션하도록 Apache를 구성할 수도 있습니다.

답변1

기본적으로 mod_proxy_html은 인라인 CSS 및 Javascript의 링크를 다시 작성하지 않습니다. 이를 활성화하려면 ProxyHTMLExtended On. 참조문서.

그러면 문제가 해결될 수 있지만 인라인에 포함된 대신 다른 파일에서 가져온 CSS 및 Javascript에는 영향을 미치지 않습니다. 이러한 문제도 해결하려면 mod_sed 또는 mod_line_edit와 같은 다른 모듈을 사용해야 합니다. 그것도 효과가 있을 수 있지만 코드(예: Javascript)에서 URL은 정규식 파서가 찾을 수 없는 임의의 방식으로 계산될 수 있기 때문에 완전히 올바르게 하는 것이 불가능할 수도 있습니다.

관련 정보