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 underlovely.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'}]}
Как мне преодолеть эти проблемы и достичь своих целей?
Вы можете сделать это с помощью 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 , чтобы опробовать его прямо сейчас и посмотреть, работает ли оно.