gpt4 book ai didi

apache - 构建位于反向代理后面的应用程序时处理URI的策略

转载 作者:可可西里 更新时间:2023-11-01 15:26:59 28 4
gpt4 key购买 nike

我正在构建一个带有独立http服务器的应用程序,该服务器可以直接访问,也可以放在反向代理(比如apachemod_proxy)后面。
所以,假设我的应用程序在端口8080上运行,并且您像这样设置您的apache:

ProxyPass /myapp http://localhost:8080
ProxyPassReverse /myapp http://localhost:8080

这将导致进入Apache服务器的HTTP请求进入到我的应用程序。如果请求像 /myapp/*一样出现,我的应用程序将看到 GET /myapp/bar。这是应该的。
出现的问题是生成必须从我的应用程序的uri空间转换的uri,以便通过代理正常工作(即预先 GET /bar)。
/myapp/指令负责处理http头(重定向等)中的uri,但它不处理我的应用程序生成的html或静态文件和模板中的uri。
我知道像 ProxyPassReverse这样的过滤器,但这是一个非标准的apache模块,而且在任何情况下,这些过滤器可能不适用于其他能够充当反向代理的前端web服务器。
所以我提出了一些可能的策略:
要求在包含代理路径的某处设置环境变量,并将其前置到所有生成的uri。这看起来不雅;它破坏了反向代理提供的封装。
将代理路径放入应用程序的配置文件中。反对意见同上。
在我的应用程序中只使用相对uri。这可能会有点棘手;我必须计算当前资源和链接要去的位置之间的路径差异,并添加适当数量的 mod_proxy_html。看起来很乱。另一个问题是,有些东西必须生成绝对uri,比如rss提要和生成的电子邮件。
在前端使用一些粗糙的javascript来咀嚼文档文本中的uri。从互操作性的角度来看,这似乎是一个非常可怕的想法。
在我的代码中使用一个单一的uri生成函数,并要求javascript、css等“静态”文件在我的模板系统中运行。这就是我现在倾向于的想法。
这一定是一个相当普遍的问题。你过去是怎么做到的?什么起了作用,什么让事情变得更困难?

最佳答案

是的,常见问题。如何解决这个问题取决于你所拥有的应用程序类型,以及你所使用的服务器平台和web框架。但我有一个解决这些问题的一般方法,到目前为止效果很好。
我的偏好是在应用程序代码中处理这样的问题,而不是依赖于像mod_proxy_html这样的web服务器模块来完成,因为通常有太多的特殊情况(例如,客户端javascript动态地组装url)服务器模块无法捕获。也就是说,在一些情况下,我采用了服务器模块的方法,但是我决定自己修改模块代码来处理角落的情况。记住,在生成代码的时候修复URL通常比通过另一个服务器模块推送整个HTML更快。
下面是我对如何在代码中处理此问题的建议:
首先,您需要弄清楚要生成什么类型的url。我更喜欢相对url。上面所说的“添加适当数量的../'es”是错误的,但至少这是您(程序员)的错误。如果您使用配置文件/环境变量方法,那么您将依赖于部署您的应用程序的人员(例如工资低且脾气暴躁的IT运营工程师)来始终正确地设置设置。它还使代码的发布复杂化,即使您自己进行部署,因为您不能简单地将开发文件复制到生产环境中,而是需要添加每个部署环境的自定义步骤。我在过去发现,消除潜在的部署问题是值得很多先发制人的编码。
接下来,您需要将这些url输入到代码中。如何做到这一点根据内容/代码的类型而有所不同:
对于服务器端代码(例如php、ror等),您需要确保在代码中尽可能少的地方生成服务器端url(理想情况下,只有一个方法!)。如果您使用的是任何主流的MVC Web框架(如RoR、Django等),这应该很简单,因为使用MVC框架生成URL通常已经通过一个可以重写的代码路径。如果您没有使用这些框架中的任何一个,那么您的代码中很可能到处都是url生成。但是您需要采取的方法是通过代码生成所有url,然后重写该方法以支持将非相对url转换为相对url。您通常可以在代码中搜索模式(如"/'/"http://'http:// )并进行手动搜索和替换(或者,如果您真是个书呆子,比我更有耐心,请编写一个regex来替换源代码中的每个常见情况)。
使这项工作可靠的关键是,不要在服务器端代码中手动将所有绝对url替换为相对url(即使您正确地处理了每一个url,但如果文件被移动,它们也是脆弱的),您可以保留绝对url,只需调用“relativeizer”方法就可以将它们包装起来。这是更可靠和牢不可破的。
对于javascript,我通常喜欢做与服务器代码相同的事情——将所有url生成移到一个方法中,并确保任何url生成都调用此方法。这对于一个有很多预先存在的JavaScript的应用程序来说是困难的,但是上面的搜索和替换方法在JS中也很有效。
对于css,css中的url相对于css文件的位置(而不是调用html页面),因此使用相对url通常很容易。只需将您的css放入一个文件夹中,然后将图像放入其下面较深的文件夹中,或者将图像放入与css平行的文件夹中,然后使用一个../相对地获取图像。这通常是一个很好的最佳实践——如果您还没有在css中使用相对url,那么您应该考虑这样做,而不考虑反向代理。
最后,您将需要了解如何处理其他古怪的静态文件(例如,传统的静态html文件有时会悄悄进入)。一般来说,我建议使用与css和图像相同的做法——理想情况下,您应该将静态文件放入可预测的目录中,并依赖于相对的url。或者(取决于您的服务器平台)可能更容易重新映射这些静态文件的文件扩展名,以便由Web框架处理它们,然后为所有URL运行服务器端URL生成器。或者,除此之外,您可以将文件保留在适当的位置,并手动将URL修复为相对的——知道这很脆弱。
在完整的循环中,有时会有太多的地方生成url,使用mod_proxy_html这样的服务器模块会更有效。但我认为这是最后的办法——特别是如果您不愿意在需要时编辑源代码的话。
顺便说一句,我意识到我没有提到你上面的想法(javascript链接链接链接)。我不会这么做——如果用户关闭了javascript或者(更常见的)某个网络问题在页面加载后的一段时间内阻止了javascript,那么您的链接就不会工作。太冒险了。

关于apache - 构建位于反向代理后面的应用程序时处理URI的策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1923151/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com