使用 ProxyHTMLURLMap 重定向 css 和 js 请求

使用 ProxyHTMLURLMap 重定向 css 和 js 请求

我已经在 Ubuntu 16.04 上安装了 apache 2.4.19,并与 Tomcat 配合使用。我正在尝试添加一个节点应用程序并将所有对 /node 的请求重定向到http://本地主机:3000使用 ProxyPass。我的节点应用程序当然正在监听端口 3000。

它非常有效地重定向我的请求,例如https://myapi.com/node/foo

但是我对使用生成的文档有疑问apidoc我在 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按照 Andrew Schulman 的建议使用,因为它会弄乱 apidoc.js 的输出。用 apidoc.js
生成index.html的代码在最后有这样的语句:
<script data-main="main.js" src="vendor/require.min.js"></script>
然后main.js做了一堆我试图在脚本语句中用require
替换但是要求失败了... 我还注意到如果我查询main.jsnode/main.js
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 可以以正则表达式解析器无法找到的任意方式计算。

相关内容