![]() |
1
7
是的,常见问题。如何解决这一问题取决于您所拥有的应用程序类型以及您所使用的服务器平台和Web框架。但我有一种处理这些问题的一般方法,到目前为止效果相当好。 我的首选是在应用程序代码中处理类似这样的问题,而不是依靠mod_proxy_html之类的Web服务器模块来处理,因为通常有太多的特殊情况(例如客户端javascript动态组装URL),而服务器模块无法捕获这些特殊情况。也就是说,在一些情况下,我采用了服务器模块的方法,但我决定自己修改模块代码来处理角落的情况。还要记住perormance;在代码生成时修复URL通常比将整个HTML推送到另一个服务器模块更快。 以下是我在代码中如何处理此问题的建议: 首先,您需要确定要生成哪种URL。我的首选是相对URL。上面的“添加适当数量的../”是混乱的,但至少这是您(程序员)的混乱。如果使用config file/environment变量方法,那么您将依赖于部署您的应用程序的人(例如,一个报酬低且脾气暴躁的IT运营工程师)来始终正确地设置这些内容。它还使代码的发布复杂化,即使您自己进行部署,因为您不能简单地将开发文件复制到生产环境中,而是需要添加每个部署环境的自定义步骤。我过去发现消除潜在的部署问题是值得的 许多 先发制人的编码。 接下来,您需要将这些URL输入到代码中。根据内容/代码的类型,您如何执行此操作会有所不同:
对于服务器端代码(如php、ror等),您需要确保在代码中尽可能少的地方生成服务器端URL(理想情况下,一个方法!).如果您正在使用任何主流的MVC Web框架(例如ror、django等),这应该是微不足道的,因为使用MVC框架的URL生成通常已经通过一个可以重写的代码路径。如果您不使用这些框架中的任何一个,那么您的代码中很可能会有大量的URL生成。但是,您希望采用的方法是通过代码生成所有URL,然后重写该方法以支持将非相对URL转换为相对URL。您通常可以在代码中搜索模式(例如
使这项工作可靠的关键是,您可以将绝对URL保留在适当的位置,并通过调用“relativizer”方法简单地将它们包装起来,而不是用服务器端代码中的相对URL手动替换所有绝对URL(即使每个URL都正确,但如果文件被移动,则很脆弱)。这是更可靠和不可抗拒的。 对于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,那么您的链接将无法工作。太冒险了。 |
![]() |
Pedro Henrique · 如何为自己分配代理陷阱? 11 月前 |
![]() |
Kwang Sing · 在chrome扩展中为请求添加前缀的正确设置是什么? 11 月前 |
![]() |
devops-admin · 如何将Nginx配置为转发代理服务器? 1 年前 |
![]() |
Shuxin · 为什么创建Java动态代理需要接口参数 1 年前 |
![]() |
kwarter · 如何模拟RestTemplate代理调用? 1 年前 |
![]() |
Lesha Pipiev · 通过自定义代理向S3发送PUT对象请求 1 年前 |