新手问题。我有一个 URL
http://myserver.com/game
并想调用内部资源
http://localhost:5732/
我试过:
AllowCONNECT 5732
ProxyPass /game/ http://localhost:5732/ nocanon
ProxyPassReverse /game/ http://localhost:5732/
但返回的 HTML 包含未添加 /game/ 前缀的链接,并且 JS 和 CSS 已损坏。因此我尝试:
RewriteEngine On
RewriteRule ^/game(.*) http://localhost:5732$1
但这会向浏览器发送重定向(当然不起作用)。
我哪里做错了?我的目标是:
http://myserver/game --> http://localhost:5732/
非常感谢您的帮助
答案1
如果你的 Apache 版本足够新(2.4+),你可以尝试mod_proxy_html
ProxyPass /game http://localhost:5732 nocanon
ProxyPassReverse /game http://localhost:5732
<Location /game/>
ProxyHTMLEnable On
ProxyHTMLURLMap / /game/
</Location>
对于较旧版本的 Apache,您可以尝试使用mod_substitute。但是,这需要您手动编写正则表达式。这可能是一个起点:
ProxyPass /game http://localhost:5732 nocanon
ProxyPassReverse /game http://localhost:5732
<Location /game/>
SetOutputFilter SUBSTITUTE
Substitute s|href='/|href='/game/|nq
Substitute s|src='/|src='/game/|nq
</Location>
当然,具体的配置取决于您当前从游戏服务器获得的输出。
答案2
您使用 ProxyPass 和 ProxyPassReverse 执行的第一个版本是执行所需操作的最常用方法。问题是,无论您在 localhost:5732 上运行什么,它都会创建将被发送回的 HTML - 并且它不知道它不叫 localhost:5732。您的代理密码不会更改通过的页面,因此如果您的游戏包含所有错误的链接,您就会看到这些。
因此,为了使其正常工作,您需要重新配置您的游戏设备,以便它知道将其链接等显示为 your.server/game 而不是 localhost.5732。