哪些cloudflare pagerule 可以让子域名看起来像主域名下的 url 路径?

哪些cloudflare pagerule 可以让子域名看起来像主域名下的 url 路径?

我有一些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 工人游乐场立即尝试一下,看看是否有效。

相关内容