Я настраиваю Apache2 как обратный прокси для удаленного сайта. Предположим, удаленный сайт http://app.remotesite.com. Вот фрагмент конфигурации моего виртуального хоста:
ProxyPass /pxy/ http://app.remotesite.com/
Таким образом, это должно принять запрос вроде http://app.mysite.com/pxy/search?q=abc, и передать его как http://app.remotesite.com/search?q=abc.
Когда я пытаюсь это сделать, я получаю "неверный запрос". Судя по выходным данным в /var/log/apache2/error.log, прокси работает правильно, но похоже, что при подключении к удаленному сайту он делает это со своим IP-адресом. Если я возьму этот IP-адрес (напечатанный в error.log) и сделаю с ним запрос, например http: // [IP адрес] / search? q = abc, я получаю ту же ошибку «Неверный запрос». Моя гипотеза заключается в том, что удаленный сайт полагается на имя хоста для правильного обслуживания запроса, но mod_proxy не отправляет его. Я знаю о параметре ProxyPreserveHost, но он предназначен для сохранения исходного имени хоста в запросе прокси (в данном случае app.mysite.com), чего я не хочу.
Может ли кто-нибудь предложить мне способ заставить mod_proxy использовать имя хоста удаленного сайта в своем запросе? Или, если моя гипотеза не имеет смысла, укажите, что еще может пойти не так?
Ваша гипотеза, вероятно, неверна. mod_proxy
подключается, используя имя хоста, указанное в URL-адресе прокси.
Если вы запросите http://app.remotesite.com/search?q=abc
в командной строке с помощью curl
, вы получите ожидаемый ответ? Если это так, то лучше всего начать с рассмотрения разницы между запросом, который производит curl, и запросом, который mod_proxy
пересылает.
Чтобы увидеть, что curl
делает, вы можете использовать --trace-ascii <file>
вариант, например:
curl --trace-ascii trace.out http://app.remotesite.com/search?q=abc
Это даст результат в trace.out
это выглядит примерно так:
== Info: About to connect() to google.com port 80 (#0)
== Info: Trying 74.125.228.8... == Info: connected
== Info: Connected to google.com (74.125.228.8) port 80 (#0)
=> Send header, 165 bytes (0xa5)
0000: GET / HTTP/1.1
0010: User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7
0050: NSS/3.13.1.0 zlib/1.2.3 libidn/1.18 libssh2/1.2.2
0084: Host: google.com
0096: Accept: */*
00a3:
Получить ту же информацию из Apache немного сложнее; я хотел бы использовать tcpdump
, который является инструментом захвата пакетов. Начните захват пакетов следующим образом:
tcpdump -w packets -s 1500 port 80 and host app.remotesite.com
Пока tcpdump запущен, сделайте запрос из браузера (или curl, или что-то еще), остановите tcpdump
с участием ^C
, а затем просмотрите файл следующим образом:
strings packets
Что даст вам что-то вроде:
{GET / HTTP/1.1
User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.13.1.0 zlib/1.2.3 libidn/1.18 libssh2/1.2.2
Host: google.com
Accept: */*
Это покажет запрашиваемый URL, Host:
заголовок и другая полезная информация. Посмотрите, как это выглядит, и возвращайтесь сюда, если не заметили чего-то очевидного.