Можно ли использовать Cloudflare Service Worker в качестве прокси-веб-сервера? - PullRequest
0 голосов
/ 27 января 2020

это просто вопрос начального уровня, требующий некоторого совета, в котором следующие могут также неправильно использовать некоторые ключевые термины из-за недостатка знаний, но, надеюсь, могут передать ключевое сообщение всем вам:

Справочная информация:
моя компания размещает веб-сайт в AWS, все работает нормально, за исключением того, что его нельзя загрузить в Китае из-за хорошо известного китайского Great Firewall, который блокирует все незарегистрированные / нелицензированные веб-сайты за пределами Китая; Лучшее решение, возможно, - разместить сервер в Китае и получить лицензию ICP, которая будет одобрена правительством Китая, но это потребует времени и многих других соображений. Поэтому сейчас мы ищем некоторые альтернативы, чтобы наши клиенты из Китая могли читать контент с нашего сайта.

Основная идея:
использовать работника службы Cloudflare, чтобы сначала получить ресурсы HTTP с заданной веб-страницы, а затем отправить контент HTTP пользователям служащим службы (поскольку Cloudflare доступен в Китай)

Пример:
Пусть URL зарегистрированного сотрудника службы поддержки Cloudflare будет: sample.workers.dev
Целевой контент веб-сайта для обслуживания: google.com
Когда пользователь пытается Чтобы получить доступ к этому домену (sample.workers.dev), работник службы должен попытаться загрузить весь контент HTTP, включая изображения и сценарии и css, с google.com в бэкэнде, а затем вернуть контент HTTP пользователям напрямую

Это будет работать для клиентов моей компании, потому что мы обычно генерируем URL-адрес и отправляем пользователю по электронной почте или каким-либо другим способом, поэтому мы можем отправить им сторонний URL-адрес, который доступен в Китае, при фактической загрузке контента с нашего исходного веб-сайта. .

Я уже перепробовал все примеры, приведенные Cloudflare: https://developers.cloudflare.com/workers/templates/ Но пока не получилось ревни то, что я хочу именно.

Есть мысли?

1 Ответ

0 голосов
/ 12 февраля 2020

да, это возможно. я помню, кто-то из Cloudflare реализовал это в качестве примера.

Нашел: https://github.com/lebinh/cloudflare-workers/blob/master/src/proxy.ts

Однако работники Cloudflare теперь поддерживают потоковый API IIR C, так что есть лучший способ сделать это.

/**
 * HTTP Proxy to arbitrary URL with Cloudflare Worker.
 */

/**
 * Cloudflare Worker entrypoint
 */
if (typeof addEventListener === 'function') {
    addEventListener('fetch', (e: Event): void => {
        // work around as strict typescript check doesn't allow e to be of type FetchEvent
        const fe = e as FetchEvent
        fe.respondWith(proxyRequest(fe.request))
    });
}

async function proxyRequest(r: Request): Promise<Response> {
    const url = new URL(r.url)
    const prefix = '/worker/proxy/'
    if (url.pathname.startsWith(prefix)) {
        const remainingUrl = url.pathname.replace(new RegExp('^' + prefix), '')
        let targetUrl = decodeURIComponent(remainingUrl)
        if (!targetUrl.startsWith('http://') && !targetUrl.startsWith('https://')) {
            targetUrl = url.protocol + '//' + targetUrl
        }
        return fetch(targetUrl)
    } else {
        return new Response('Bad Request', {status: 400, statusText: 'Bad Request'})
    }
}

interface FetchEvent extends Event {
    request: Request;

    respondWith(r: Promise<Response> | Response): Promise<Response>;
}
...