如何使用ProxyPass通过Express提供静态文件?

2023-12-25

我正在使用 Apachemod_proxy使用 Express 为我的 Node 应用程序提供服务,

ProxyPass /nodeapp http://localhost:3000/
ProxyPassReverse /nodeapp http://localhost:3000/

但是静态 JS 和 CSS 是从错误的地方请求的。

例如,我想要来自的 CSS

http://homepage/nodeapp/css

但它正在被要求

http://homepage/css

我通过在应用程序的index.html 中使用HTML“Base”标签解决了我的环境中的这个问题,然后确保应用程序中的所有链接都是相对的。这将有助于确保浏览器请求适当的路径。

值得注意的是,由于我的应用程序是 SPA(单页应用程序),因此所有资产始终有效,因为实际导航始终位于根目录。

在你的情况下标签(在<head>元素)可能看起来像:

<base href="/nodeapp/">

我对应的 Apache 配置很简单:

<Location /nodeapp>
  ProxyPass http://127.0.0.1:9000
  ProxyPassReverse http://127.0.0.1:9000

  # other Apache directives here
</Location>

我的应用程序碰巧使用 AngularJS,我可以使用 # 字符到达应用程序的“根”。例如,如果我想去/settings(这将是/nodeapp/settings在生产中)我会指定#settings as the href对于任何给定的链接。您的里程可能会有所不同,但这确实值得一看https://docs.angularjs.org/guide/ https://docs.angularjs.org/guide/$location 如果你使用 AngularJS 并摆弄html5Mode设置以查看最适合您的部署的设置。

我不必向 Express 讲述其挂载点,因为浏览器正在使用<base>上面的标签,以及ProxyPass/ProxyPassReverseApache 指令适当地剥离/nodeapp在将其交给 Express 之前。

虽然我不必接触 Express 的路由器(如上所述),但理解以下内容可能仍然有用。如果您使用 Express 4.x,“安装”Express 应用程序据称比以前版本的 Express 更容易。这里有一些很好的例子:https://github.com/visionmedia/express/wiki/New-features-in-4.x https://github.com/visionmedia/express/wiki/New-features-in-4.x

从该页面:

想象一下您的项目中的一个示例routes/people.js。

var people = express.Router();

people.use(function(req, res, next) {
});

people.get('/', function(req, res, next) {
});

module.exports.people = people;

您可以将其安装在 /people 路径下,以便任何对 /people/* 的请求都将路由到 people 路由器。

app.use('/people', require('./routes/people').people);

该页面还会引导您访问 Express 4.x Router API:http://expressjs.com/4x/api.html#router http://expressjs.com/4x/api.html#router

但是,如果您使用 Apache 的,则通常不需要此技术ProxyPass重写入站请求。

如果您的应用程序不是 SPA,您可能会幸运地使用以下命令进行动态内容重写mod_proxy_html。我在这方面取得的成功有限,但 AngularJS 最终不太喜欢它。但是,我相信它可能适合不同的应用程序。

如果您选择使用mod_proxy_html您可以在此处查看 StackOverflow 问题和答案以获取更多信息:ProxyHTML 重写 URL https://stackoverflow.com/questions/14431090/proxyhtml-to-rewrite-url

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用ProxyPass通过Express提供静态文件? 的相关文章

随机推荐

  • 将光标设置到 contenteditable div 的末尾

    如果当前标签为空 我试图将光标设置到下一个 上一个 contenteditable 标签的末尾 但是当我设置焦点时 它将焦点添加到文本的开头而不是结尾 尝试了几乎所有的解决方案 但似乎没有一个对我有用 这是我正在尝试的简单代码 HTML代码
  • 在android中查询“dumpsys meminfo”

    当我在 android 4 2 上运行 adb shell dumpsys meminfo 时 我得到的结果如下 Shared Private Heap Heap Heap Pss Dirty Dirty Size Alloc Free N
  • 如何使用 Selenium IDE 上传文件?

    这在过去是有效的 但最近我一直在尝试使用 Selenium IDE 上传文件 现在我收到此错误 错误 意外异常 代码 gt 1000 INDEX SIZE ERR gt 1 DOMSTRING SIZE ERR gt 2 HIERARCHY
  • 在 MVC 5 中使用 ModelClientValidationRule 抛出错误?

    我尝试在 MVC 5 项目中进行自定义客户端验证 当我添加以下代码时 public IEnumerable
  • 在一个txt文件中搜索多个字符串

    我确实知道对此还有多个其他答案 但它们不适合我的代码 因为我的代码每次搜索必须处理 1000 行以上 我想组合 2 个输入的字符串 以便 PHP 脚本在 txt 文件中搜索这两个字符串 并在输出时组合它们 这是我尝试过的 search GE
  • 为什么当我从网络浏览器打开它并在Java中读取它时,html源代码是不同的? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有一个关于解析在线 html 页面
  • CakePHP:提交失败时清除密码字段

    问候 我正在设置一个带有密码字段的非常标准的注册表单 问题是 提交失败后 由于字段为空 格式不正确等 控制器会重新加载注册页面 但密码字段包含先前输入的密码的哈希值 每次提交失败后如何将其清空 View echo form gt passw
  • 使用 selectize 从选定内容获取文本

    我试过这个 var eventHandler function return function console log select val var select selectize selectize create true onChan
  • 原则 2,本机查询

    我正在尝试使用 Doctrine 2 进行本机查询 但我无法使其工作 q SELECT FROM user recent activity WHERE id user gt id rsm new Doctrine ORM Query Res
  • 运行时错误“1004”无法获取 WorksheetFunction 类的 Match 属性

    nSectionSetupRow Application WorksheetFunction Match Worksheets Items Cells nRow 1 Worksheets SectionSetup Range B1 B Wo
  • 下一个/路由器和下一个/导航有什么区别?

    在 Next js 中 我都知道next router and next navigation have a useRouter hook 但是返回的对象不同 为什么 Next js 在两个路由包上有相同的钩子 The useRouter
  • 将 ifstream 转换为 bool 与使用 ifstream::is_open() 之间的区别

    也许是一个虚拟问题 但我需要一个明确的答案 这些函数的返回有什么区别吗 int FileExists const std string filename ifstream file filename c str return file in
  • Fortran FORMAT 语句中的语法错误

    I am using the gfortran compiler and I am unable to find the syntax error in the line Can anyone tell me the syntax erro
  • SQL排除查询

    是否可以在单个 SQL 语句中执行以下操作 例如 在提示中使用电话号码的子集8001231000 8001239999 然后查询我的数据库中有电话号码 并返回原始子集中哪些电话号码不在我的数据库中 我的数据库是Oracle 10g 基本上不
  • JSON.NET 反序列化对象/对象数组中的对象

    我遇到的情况是 我使用的 API 返回不一致的 JSON 我想使用 JSON NET 对其进行反序列化 在一种情况下 它返回一个包含对象的对象 注意外面的 1 可以是任何数字 1 0 db id 12835424 title XXX 1 d
  • 以编程方式评估 somaxconn 的值,以设置监听积压参数

    对于服务器端编程 我使用监听函数 int listen int sockfd int backlog 我知道积压工作应该小于或等于我将运行服务器程序的主机系统上设置的 somaxconn 如果我使用 SOMAXCONN 作为积压工作 则相当
  • 逐行扫描谷歌文档

    所以基本上 我尝试使用 node js 扫描 google 文档 然后如果 ROBLOX id 在那里 它就会跟踪它 当它跟踪它时 如果它加入了 id 列表中的某个组 它就会自动将其放逐 有什么帮助吗 我在逐行扫描谷歌文档时有点卡住了 我不
  • 如何在创建文件之前测试文件是否存在

    我想看看文件是否存在 如果它不存在 那么我想创建它 顺便说一句 我正在使用Linux 你不能可靠地做到这一点 在您检查文件是否存在和创建文件之间 另一个进程可能会创建它 您应该继续创建该文件 根据您尝试执行的较大操作 如果文件已存在 您可能
  • 子div高度与父div高度不同

    我有一个7divs包裹在 3divs 除第一个之外的所有div被设置为width 0 并且它们都设置为inline block 最外面的div有一个设定的高度166px 结果出来了 独生子 7 divs你看 是第一个 问题是 第三个包装器
  • 如何使用ProxyPass通过Express提供静态文件?

    我正在使用 Apachemod proxy使用 Express 为我的 Node 应用程序提供服务 ProxyPass nodeapp http localhost 3000 ProxyPassReverse nodeapp http lo