- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在构建一个带有独立http服务器的应用程序,该服务器可以直接访问,也可以放在反向代理(比如apachemod_proxy
)后面。
所以,假设我的应用程序在端口8080上运行,并且您像这样设置您的apache:
ProxyPass /myapp http://localhost:8080
ProxyPassReverse /myapp http://localhost:8080
/myapp/*
一样出现,我的应用程序将看到
GET /myapp/bar
。这是应该的。
GET /bar
)。
/myapp/
指令负责处理http头(重定向等)中的uri,但它不处理我的应用程序生成的html或静态文件和模板中的uri。
ProxyPassReverse
这样的过滤器,但这是一个非标准的apache模块,而且在任何情况下,这些过滤器可能不适用于其他能够充当反向代理的前端web服务器。
mod_proxy_html
。看起来很乱。另一个问题是,有些东西必须生成绝对uri,比如rss提要和生成的电子邮件。
最佳答案
是的,常见问题。如何解决这个问题取决于你所拥有的应用程序类型,以及你所使用的服务器平台和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://
,
使这项工作可靠的关键是,不要在服务器端代码中手动将所有绝对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/
我正在使用 javascript 并有以下类: const Product = require('../models').Product class ProductService { cons
我正在开发一个简单的应用程序,宠物用户可以在其中创建关于他们宠物的板并在板上显示图片。 我正在尝试创建一个功能,用户可以点击他们的图板,将他们重定向到他们的图板,该图板将显示他们所有的宠物图片。 当我
我有这样的事情:循环遍历 ids,并对每个 ids 向服务器(同一域)发出 ajax 请求 (async:true) 并将接收到的数据附加到 DOM 元素。这不是一项艰巨的任务,它确实有效。示例代码:
我正在尝试使用 Pillow 在我的网络应用程序中添加用户可上传的图像。我创建了一个 Django Upload 模型并将其注册到 Admin 中。当我使用管理控制台添加照片后,我收到以下错误。最初该
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
说到 UINavigationBar 时我有点困惑。我以编程方式设置它,它的作用是将我的 viewController 向下推(因此在启动应用程序后看不到 Storyboard中看到的 View 底部
我有以下查询,它可以满足我的要求,并显示从出生日期转换而来的人们的年龄。但我现在想通过说大于或小于这些年龄来缩小结果范围,但我不知道该怎么做。 SELECT u.`id` as `user_id`
我有一个 ListView (不是 recyclerView),其中每一行都有一个按钮、几个 TextView 和一个 EditText。单击特定按钮(“editTremp”)后,我希望 EditTe
我的 cellAtIndexPath 中有一个查询。正如常见的那样,此查询从单元格行索引处的数组中获取对象。我想知道每次加载 tableView 时是否只有一个查询,还是将其算作每个 indexPat
我目前正在探索 http://www.ecovivo.be/rubriek/food 上使用的模板中的错误. 问题:访问该链接时,您会注意到右侧有一个带有内容的大型 float 图像。现在一切正常。但
我在 ViewController 之间通过引用传递特定模型的数组。 如果我更改数组中特定元素的任何值,它会在所有 ViewController 中很好地反射(reflect),但是当我从该数组中删除
svg 包含更多元素,其中之一是下拉选择器。我遇到的问题是选择器只能在其顶部边缘被点击,而不能在选择器的其他任何地方被点击。 选择器称为 yp-date-range-selector。在下一张图片中,
我的元素使用 20 行 20 列的 css 网格布局(每个单元格占屏幕的 5%)。其中一个页面有一个按钮。最初该页面包含在网格第 5-8 列和网格第 6-9 行中,按钮本身没有问题,但我需要将其居中放
我想使用 CSS Trick 使图像居中.但是如果图像大小是随机的(不固定的)怎么办。令人惊讶的是,我不想保持图像响应,我想在不改变其宽度或高度(实际像素)的情况下将图像置于中心。 下面是我的代码:
我正在尝试在网址之间进行路由。产品是一个类: from django.db import models from django.urls import reverse # Create your mo
我正在通过查看 Django 教程来制作网站。我收到一个错误: NoReverseMatch at /polls/ Reverse for 'index' with no arguments not
我一直在试用 Django 教程 Django Tutorial Page 3并遇到了这个错误 "TemplateDoesNotExist at /polls/ " . 我假设问题出在我的代码指向模板
我有一个应用程序,其中大部分图像资源都存储在单独的资源包中(这样做是有正当理由的)。这个资源包与主应用程序包一起添加到项目中,当我在 Interface Builder 中设计我的 NIB 时,所有这
我使用 Xcode 6.3.2 开发了一个 iPad 应用程序。我将我的应用程序提交到 App Store 进行审核,但由于崩溃而被拒绝。以下是来自 iTunes 的崩溃报告。 Incident Id
我正在使用以下内容来显示水平滚动条: CSS: div { width: 300px; overflow-x: scroll; } div::-webkit-scrollbar {
我是一名优秀的程序员,十分优秀!