我已经在 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.js
node/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 可以以正则表达式解析器无法找到的任意方式计算。