使用 javascript 改变 window.location 的代理网站?

使用 javascript 改变 window.location 的代理网站?

在配置 httpd 方面有点新手,但我的情况如下:

我正在尝试代理一个应用程序(我们称之为猫应用) 我无法通过 httpd 进行控制。

猫应用,一个 html/javascript 应用程序,其前端也运行着 httpd。但我无法修改该配置,我只能控制顶层 httpd 配置。

事实证明,index.html猫应用,有一个javascript调用:

window.location="viewer.html"

这是为了加载查看器页面。

通常情况下,编写ProxyPass指令很容易,这就是我目前所拥有的:

ProxyPass /catsapp http://catsapp-server timeout=600
ProxyPassReverse /catsapp http://catsapp-server timeout=600

但这并不奏效。如果我导航到 ,example.com/catsapp则会200 OK立即得到 ,404 Not Found因为浏览器会尝试加载example.com/viewer.html而不是example.com/catsapp/viewer.html

有没有办法配置根 httpd 服务器,以便当猫应用调用window.location="viewer.html"它解析为example.com/catsapp/viewer.html

答案1

我猜想有多个资源需要从您的应用程序加载,因此example.com/catsapp应该查看子目录。如果没有尾部斜杠,浏览器会将其example.com/catsapp视为文件类资源,而不是文件夹类资源。按照相对于 的链接指向。viewer.html但是,相对于 的解析(注意尾部斜杠)会解析为。example.com/catsappexample.com/viewer.htmlviewer.htmlexample.com/catsapp/example.com/catsapp/viewer.html

我建议重定向example.com/catsappexample.com/catsapp/(不是内部重定向,而是通过 HTTP 3xx)并编辑ProxyPass规则以包括尾部斜杠。例如:

Redirect permanent /catsapp /catsapp/
ProxyPass /catsapp/ http://catsapp-server/ timeout=600
ProxyPassReverse /catsapp/ http://catsapp-server/ timeout=600

答案2

经过进一步的挖掘,我发现我想做的事情并不是“轻易”可以实现的。我现在明白问题是这样的:

  1. 浏览器请求 example.com/catsapp
  2. 根 httpd 服务器拦截请求并转发至http://catsapp-服务器/
  3. catsapp-server httpd 接收请求并返回index.html
  4. 根 httpd 服务器向客户端返回响应
  5. 浏览器接收index.html
  6. 浏览器将位置更改为 example.com/viewer.html(因为 javascript 告诉它这么做)

因此,在 httpd 退出后,客户端会决定错误的 URL。看来我必须使用类似的东西来mod_substitute更改在步骤 #4 中发送回客户端的响应,以/catsapp在 之前插入我的自定义路径viewer.html。听起来很丑陋,而且容易出错。


我决定做的似乎更强大一些,但仍然非常特定于此用例。我注意到index.html仅存在将客户端重定向到。那么为什么我不在上面的步骤 #2 中自动执行此操作呢?我尝试通过将添加到根 httpd 服务器来viewer.html实现。RewriteRule

RewriteRule (.*/catsapp) https://%{HTTP_HOST}%{REQUEST_URI}/viewer.html [R,L]

而且它似乎运行得很好。我不思考应用程序的其他区域也尝试改变位置index.html,并且此解决方案对于发生这种情况的任何情况都不起作用......所以希望它能奏效。

相关内容