What cloudflare pagerule can make a subdomain appears like a url path under the main domain?

I have some tumblr contents living on a site called lovely.mycompany.com

What I would like to achieve is the following:

When a user visits lovely.mycompany.com/lovely, it should see the content of under lovely.mycompany.com.

If a user visits www.mycompany.com/lovely/what-a-day, it should отображать содержимое 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) Он не поддерживает URL-адреса типа lovely.mycompany.com/what-a-day

Я пробовал следующий набор правил страницы (вывод api pagerule cloudflare)

// 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'}]}

Как мне преодолеть эти проблемы и достичь своих целей?

0
задан 20 April 2018 в 10:34
1 ответ

Вы можете сделать это с помощью Cloudflare Workers , которые позволяют писать код JavaScript для обработки запросов к вашему сайту. Рабочие позволяют вам переписывать запросы и отправлять их на другие серверы.

Вот сценарий, который делает то, что вы описываете:

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)
  }
}

Имейте в виду, конечно, что приведенное выше не перезаписывает никакие ссылки, URL-адреса изображений и т. Д., Которые появляются в HTML-коде страницы. Это может привести к повреждению содержимого страницы. Например, если он содержит тег изображения типа , то он попытается загрузить изображение с www.mycompany.com/some-image .jpg , который не работает. Вы можете расширить свой код, чтобы охватить все возможные URL-адреса ресурсов. Или вы могли бы написать Worker, который переписывает содержимое HTML-страницы, но это будет намного сложнее. Вот простой пример изменения содержимого страницы.

Тем не менее, похоже, что Tumblr в основном ссылается на ресурсы из других источников, поэтому вы можете быть в порядке, не изменяя содержимое страницы. Вы можете использовать Cloudflare Workers Playground , чтобы опробовать его прямо сейчас и посмотреть, работает ли оно.

1
ответ дан 4 December 2019 в 15:59

Теги

Похожие вопросы