我怎样才能使 HTML 页面上的所有相对 URL 相对于它所在的不同域(在 HTML 元素以及 JS HTTP 请求中)?
How can I make all relative URLs on a HTML page be relative to a different domain then it's on (in HTML elements as well as JS HTTP Requests)?
我有一个页面具有 "domain relative URLs",例如 ../file/foo
或 /file/foo
,在 a href
属性、img src
属性、视频、音频、web 组件中, js ajax 调用等
事情是这样的,当页面获得这样的 URL 时,我希望它们与一个特定的和不同的 domain 相关联,那么它实际上是打开的,所以说页面在 http://localhost:8081/page/
浏览器会将它们翻译成:
http://localhost:8081/page/../file/foo
http://localhost:8081/file/foo
但我真正想要的是所有相对 URL 都与它们所在的 domain 没有关系,而是与另一个 domain,e.x. http://localhost:5462/
,因此转换为:
http://localhost:5462/page/../file/foo
http://localhost:5462/file/foo
换句话说:我想要一个页面,其中包含的 URL,在 a-href、ajax 调用等中,无论您在哪里查看该页面都不会改变from(以便页面始终从同一来源获取相同的内容),它对完整的 URL 开箱即用,但对相对 URL 无效。一种定义和实施与 URL 相关的 domain 的方法,这样无论页面转到何处,其内容和行为都保持不变。
那么,我有什么选择来解决这个问题,哪个是最好的?一些想法:
- 前端解决方案
- 该页面是从 markdown 生成的,所以我可以为 markdown 制作一个插件到 html 转换器,检测 domain 相对 links 并将它们转换为完整的 url,但我还没有试验过它是否真的那么简单,也许它会在复杂的降价组件上错过 links,或者
a href
和 img src
定义不是使用降价而是 html, 或 webcomponent 元素中的各种类型的 links 等(另外,这不是一个非常通用的解决方案,不适用于 js)
- 加载页面,然后加载遍历页面上所有 links 并将 domain 相对 links 转换为具有正确 [=149] 的完整 url =] 是的。这可能更好,但它不会改变 "fundamental level" 处的关系,因此它会错过 dom 中 javascript 的相对 link,例如 ajax页面生命周期后期添加的调用或 URL。
- 而不是操纵 dom 我也许可以拦截 所有 http 调用、点击和以某种方式使用 js 的请求,检查它们是否 dom是相对的,并在必要时更改调用(但这会阻止用户面对的行为,例如在悬停 link 时预览用户将去的地方)
- 也许存在某种类似
meta
的标签,我可以将这些选项放入 html 的 header 中,从而改变 domain 之间的关系相对 links/calls 和 dom 是不是?我最近发现了 base
标签,但它似乎只适用于 HTML 元素而不适用于 js 脚本。
- 后端解决方案
- 路由
localhost:5462
在 localhost:8081
后面,这样来自 localhost:5462
的所有数据都可以在 localhost:8081
访问,这非常干净并且 显然可以正常工作,即使对于 js http 调用,我也会并且已经在零问题的情况下使用它,但有时我不想使用路由,然后我回到原点。所以这是我想要的结果,但我也需要它而无需路由(来自前端的 http 请求不会通过后端,而是到达与原始 URL 相同的 URL 或 "correct" domain).
- 也许可以在响应 object/header/ 中注入某种 domain 信息?当从后端请求页面时,该页面会欺骗页面上的所有 http 请求,以将 "correct" domain 用于 domain 相对 URL?
- 其他解决方案
- 我可以禁止使用domain relative link但我还需要支持
file:///
,这需要相对links,我首先要如何禁止它,我真的要禁止某种形式的 links 吗?
- 还有哪些解决方案?
一些需要考虑的事情
- 这不限于本地主机,它可以是 domain1.com 和 domain2.com 或 domains 的任意组合,或者在 Electron 应用程序中,等等。
- 理想情况下,当查看页面的源代码时,"live inspecting" 它等,links 将是未修改的/看起来仍然是相对的,但是当您将鼠标悬停在 link它去向的指示器将显示相对 link 的所需翻译,而不是 domain 相对 links 的默认行为,这 "ideal" 绝对不是一些我建议的解决方案。
- 另一个理想是所有面向用户的行为都会 "just work" 但是在查看源代码或任何面向开发人员的行为时可能会很奇怪(我能想到的唯一面向用户的行为是预览你在哪里将鼠标悬停在 link).
上
- CORS 不是问题。
- 如果它适用于任何后端设置(完全前端解决方案),那将是很棒,但它也会可接受 如果它只适用于我的特定后端,因为技术上的不可能或前端解决方案太容易被黑客攻击和出错,或者它可能需要对任何后端进行普遍可行的修改。
- 我的后端是用Node/Koa写的。
最好的解决方案应该是 base 标签,但它也适用于任意未修改的 javascript,而不是 just HTML 个元素。
但如果不存在 也许 可以将 base
class 仅用于 HTML 元素,并结合使用使用一些非常简洁的 non-hacky javascript 成功拦截所有可能的 javascript 和 webassembly http(或任何其他协议)请求并将它们定向到正确的 domain 如果他们正在使用 domain 相对 URL?如果 真的是最好的解决方案 并且在技术上可行,我会怎么做?
经过一些试验后,我得出的结论是 HTTP 重定向是最好的解决方案,从根本上说,后端只是一种跳转到正确 URL 的方式。 POST 请求存在一些问题,虽然可以通过前端 javascript 修改来解决,但如果这确实是一个问题,则始终可以使用 "forwards" 切换重定向。
我有一个页面具有 "domain relative URLs",例如 ../file/foo
或 /file/foo
,在 a href
属性、img src
属性、视频、音频、web 组件中, js ajax 调用等
事情是这样的,当页面获得这样的 URL 时,我希望它们与一个特定的和不同的 domain 相关联,那么它实际上是打开的,所以说页面在 http://localhost:8081/page/
浏览器会将它们翻译成:
http://localhost:8081/page/../file/foo
http://localhost:8081/file/foo
但我真正想要的是所有相对 URL 都与它们所在的 domain 没有关系,而是与另一个 domain,e.x. http://localhost:5462/
,因此转换为:
http://localhost:5462/page/../file/foo
http://localhost:5462/file/foo
换句话说:我想要一个页面,其中包含的 URL,在 a-href、ajax 调用等中,无论您在哪里查看该页面都不会改变from(以便页面始终从同一来源获取相同的内容),它对完整的 URL 开箱即用,但对相对 URL 无效。一种定义和实施与 URL 相关的 domain 的方法,这样无论页面转到何处,其内容和行为都保持不变。
那么,我有什么选择来解决这个问题,哪个是最好的?一些想法:
- 前端解决方案
- 该页面是从 markdown 生成的,所以我可以为 markdown 制作一个插件到 html 转换器,检测 domain 相对 links 并将它们转换为完整的 url,但我还没有试验过它是否真的那么简单,也许它会在复杂的降价组件上错过 links,或者
a href
和img src
定义不是使用降价而是 html, 或 webcomponent 元素中的各种类型的 links 等(另外,这不是一个非常通用的解决方案,不适用于 js) - 加载页面,然后加载遍历页面上所有 links 并将 domain 相对 links 转换为具有正确 [=149] 的完整 url =] 是的。这可能更好,但它不会改变 "fundamental level" 处的关系,因此它会错过 dom 中 javascript 的相对 link,例如 ajax页面生命周期后期添加的调用或 URL。
- 而不是操纵 dom 我也许可以拦截 所有 http 调用、点击和以某种方式使用 js 的请求,检查它们是否 dom是相对的,并在必要时更改调用(但这会阻止用户面对的行为,例如在悬停 link 时预览用户将去的地方)
- 也许存在某种类似
meta
的标签,我可以将这些选项放入 html 的 header 中,从而改变 domain 之间的关系相对 links/calls 和 dom 是不是?我最近发现了base
标签,但它似乎只适用于 HTML 元素而不适用于 js 脚本。
- 该页面是从 markdown 生成的,所以我可以为 markdown 制作一个插件到 html 转换器,检测 domain 相对 links 并将它们转换为完整的 url,但我还没有试验过它是否真的那么简单,也许它会在复杂的降价组件上错过 links,或者
- 后端解决方案
- 路由
localhost:5462
在localhost:8081
后面,这样来自localhost:5462
的所有数据都可以在localhost:8081
访问,这非常干净并且 显然可以正常工作,即使对于 js http 调用,我也会并且已经在零问题的情况下使用它,但有时我不想使用路由,然后我回到原点。所以这是我想要的结果,但我也需要它而无需路由(来自前端的 http 请求不会通过后端,而是到达与原始 URL 相同的 URL 或 "correct" domain). - 也许可以在响应 object/header/ 中注入某种 domain 信息?当从后端请求页面时,该页面会欺骗页面上的所有 http 请求,以将 "correct" domain 用于 domain 相对 URL?
- 路由
- 其他解决方案
- 我可以禁止使用domain relative link但我还需要支持
file:///
,这需要相对links,我首先要如何禁止它,我真的要禁止某种形式的 links 吗?
- 我可以禁止使用domain relative link但我还需要支持
- 还有哪些解决方案?
一些需要考虑的事情
- 这不限于本地主机,它可以是 domain1.com 和 domain2.com 或 domains 的任意组合,或者在 Electron 应用程序中,等等。
- 理想情况下,当查看页面的源代码时,"live inspecting" 它等,links 将是未修改的/看起来仍然是相对的,但是当您将鼠标悬停在 link它去向的指示器将显示相对 link 的所需翻译,而不是 domain 相对 links 的默认行为,这 "ideal" 绝对不是一些我建议的解决方案。
- 另一个理想是所有面向用户的行为都会 "just work" 但是在查看源代码或任何面向开发人员的行为时可能会很奇怪(我能想到的唯一面向用户的行为是预览你在哪里将鼠标悬停在 link). 上
- CORS 不是问题。
- 如果它适用于任何后端设置(完全前端解决方案),那将是很棒,但它也会可接受 如果它只适用于我的特定后端,因为技术上的不可能或前端解决方案太容易被黑客攻击和出错,或者它可能需要对任何后端进行普遍可行的修改。
- 我的后端是用Node/Koa写的。
最好的解决方案应该是 base 标签,但它也适用于任意未修改的 javascript,而不是 just HTML 个元素。
但如果不存在 也许 可以将 base
class 仅用于 HTML 元素,并结合使用使用一些非常简洁的 non-hacky javascript 成功拦截所有可能的 javascript 和 webassembly http(或任何其他协议)请求并将它们定向到正确的 domain 如果他们正在使用 domain 相对 URL?如果 真的是最好的解决方案 并且在技术上可行,我会怎么做?
经过一些试验后,我得出的结论是 HTTP 重定向是最好的解决方案,从根本上说,后端只是一种跳转到正确 URL 的方式。 POST 请求存在一些问题,虽然可以通过前端 javascript 修改来解决,但如果这确实是一个问题,则始终可以使用 "forwards" 切换重定向。