Назад | Перейти на главную страницу

Как я могу принимать ответы от API с несколькими поддоменами?

Я пишу прототипы веб-сайтов, которые используют данные с сервера, который я не контролирую, ответ находится в JSON, а сервер не поддерживает JSONP, поэтому у меня проблемы с CORS, поскольку я разрабатываю только на клиенте.

Мне удалось обойти это, запустив локальный веб-сервер HTTP Apache со следующими правилами ProxyPass в моем vhosts.conf

ProxyPass /api/de/ http://de.test.com/api/
ProxyPassReverse /api/de/ http://de.test.com/api/
ProxyPass /api/jp/ http://jp.test.com/api/
ProxyPassReverse /api/jp/ http://jp.test.com/api/
ProxyPass /api/ru/ http://ru.test.com/api/
ProxyPassReverse /api/ru/ http://ru.test.com/api/
ProxyPass /api/uk/ http://uk.test.com/api/
ProxyPassReverse /api/uk/ http://uk.test.com/api/

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

Есть более 30 языков, которые я хотел бы протестировать на своих прототипах, и я хочу знать, есть ли способ динамически писать мои правила ProxyPass (или лучшее решение).

Я использую jQuery с методом getJSON, и пример URL-адреса, который я нажимаю, выглядит следующим образом

url = '/api/'+pos+'/data.html?destination=...

Где pos - это просто строка, которую я передаю с помощью 'de', 'jp', 'ru' или 'uk'

Вы можете добиться этого с помощью mod_rewrite

RewriteEngine On
RewriteRule /api/([a-z]+)/(.*) http://$1.test.com/api/$2 [P]

[P] на mod_rewrite заставляет его действовать как mod_proxy (из apache doc http://httpd.apache.org/docs/2.2/rewrite/flags.html#flag_p):

Использование флага [P] приводит к тому, что запрос обрабатывается модулем mod_proxy и обрабатывается через запрос прокси. Например, если вы хотите, чтобы все запросы изображений обрабатывались внутренним сервером изображений, вы можете сделать что-то вроде следующего:

RewriteRule /(.*).(jpg|gif|png) http://images.example.com/1. $ 2 [P]