У меня есть содержимое тамблера на сайте под названием 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) Он не поддерживает такие 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, который позволяет писать код 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-коде страницы. Это может привести к повреждению содержимого страницы. Например, если он содержит тег изображения, например <img src="/some-image.jpg">
, то это попытается загрузить изображение из www.mycompany.com/some-image.jpg
что не сработает. Вы можете расширить свой код, чтобы охватить все возможные URL-адреса ресурсов. Или вы могли бы написать Worker, который переписывает содержимое HTML-страницы, но это будет намного сложнее. Вот простой пример изменения содержимого страницы.
Тем не менее, похоже, что Tumblr в основном ссылается на ресурсы из других источников, поэтому вы можете быть в порядке, не изменяя содержимое страницы. Вы можете использовать Игровая площадка рабочих Cloudflare попробовать прямо сейчас и посмотреть, работает ли он.