我有一些tumblr内容存放在一个名为的网站上lovely.mycompany.com
我想要实现的目标如下:
当用户访问时
lovely.mycompany.com/lovely
,它应该看到下面的内容lovely.mycompany.com
。如果用户访问
www.mycompany.com/lovely/what-a-day
,它应该显示的内容lovely.mycompany.com/what-a-day
。
有几个问题:
1)lovely.mycompany.com
设置为仅HTTPS,但lovely.mycompany.com
仅支持http
2)lovely.mycompany.com
实际上托管在 Tumblr 上。有时重定向可能会导致出现https://www.tumblr.com/lovely
以下消息这里什么也没有。
3)它不支持以下 URLlovely.mycompany.com/what-a-day
我尝试了以下一组页面规则(cloudflare pagerule api 的输出)
// First rule
{u'actions': [{u'id': u'forwarding_url',
u'value': {u'status_code': 301,
u'url': u'https://mycompany.com/lovely'}}],
u'created_on': u'2018-04-20T04:51:49.000000Z',
u'id': u'023d520352f1afd893265bf2601e5459',
u'modified_on': u'2018-04-20T05:17:08.000000Z',
u'priority': 8,
u'status': u'active',
u'targets': [{u'constraint': {u'operator': u'matches',
u'value': u'mycompany.com/lovely'},
u'target': u'url'}]}
// Second rule
{u'actions': [{u'id': u'browser_cache_ttl', u'value': 60},
{u'id': u'cache_level', u'value': u'cache_everything'},
{u'id': u'resolve_override',
u'value': lovely.mycompany.com'},
{u'id': u'host_header_override',
u'value': u'lovely.mycompany.com'}],
u'created_on': u'2018-04-20T04:51:41.000000Z',
u'id': u'b3b87d2f17a924b010538ce7ce4e8a81',
u'modified_on': u'2018-04-20T05:17:08.000000Z',
u'priority': 1,
u'status': u'active',
u'targets': [{u'constraint': {u'operator': u'matches',
u'value': u'www.mycompany.com/lovely/*'},
u'target': u'url'}]}
我怎样才能克服这些问题并实现我的目标?
答案1
你可以这样做Cloudflare 工作人员,它允许您编写 JavaScript 代码来处理对您网站的请求。Workers 允许您重写请求并将其发送到其他服务器。
这是一个执行您所描述的操作的脚本:
addEventListener('fetch', event => {
event.respondWith(handle(event.request))
})
/**
* @param {Request} request
*/
async function handle(request) {
let url = new URL(request.url)
if (url.pathname.startsWith("/lovely/")) {
url.protocol = "http:"
url.host = "lovely.mycompany.com"
url.pathname = url.pathname.slice("/lovely".length)
return fetch(url, request)
} else if (url.pathname.startsWith("/what-a-day/")) {
url.protocol = "http:"
url.host = "lovely.mycompany.com"
return fetch(url, request)
} else if (url.pathname == "/lovely" ||
url.pathname == "/what-a-day") {
// Redirect to add trailing /.
url.pathname += "/"
return Response.redirect(url, 301);
} else {
return fetch(request)
}
}
当然,请记住,上述代码不会重写页面 HTML 中出现的任何链接、图像 URL 等。这可能会导致页面内容损坏。例如,如果它包含一个图像标签,如<img src="/some-image.jpg">
,那么这将尝试加载无法正常工作的图像www.mycompany.com/some-image.jpg
。您可以进一步扩展代码以涵盖所有可能的资产 URL。或者,您实际上可以编写一个 Worker 来重写 HTML 页面的内容——但这将更加复杂。这是一个修改页面内容的简单示例。
尽管如此,Tumblr 似乎主要引用来自其他来源的资产,因此您可能无需修改页面内容。您可以使用Cloudflare 工人游乐场立即尝试一下,看看是否有效。