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

Странное поведение прозрачного перенаправления squid

Я впервые настраиваю squid. Он запускает скрипт перенаправления, который выполняет некоторый текстовый поиск / замену на html-страницах, а затем сохраняет их в месте на том же компьютере по пути nginx, а затем выдает перенаправление на этот URL-адрес (это арт-проект: D).

Соответствующие строки в squid.conf:

http_port 3128 transparent
redirect_program /etc/squid/jefferson_redirect.py

Скрипт jefferson_redirect.py основан на этом скрипте: http://gofedora.com/how-to-write-custom-redirector-rewritor-plugin-squid-python/

Проблема:

У меня странное поведение переадресации http. Например, вот обычный запрос / ответ от сценария PHP, который выдает заголовок («Местоположение:»); - редирект 302:

http://redirector.mysite.com/?unicmd=g+yreka

GET /?unicmd=g+yreka HTTP/1.1
Host: redirector.mysite.com
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.9) Gecko/20100330 Fedora/3.5.9-1.fc12 Firefox/3.5.9
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300 
Connection: keep-alive

HTTP/1.1 302 Found
Date: Tue, 13 Apr 2010 05:15:43 GMT 
Server: Apache
X-Powered-By: PHP/5.2.11
Location: http://www.google.com/search?q=yreka
Content-Type: text/html
Vary: User-Agent,Accept-Encoding
Content-Encoding: gzip
Content-Length: 2108
Keep-Alive: timeout=3, max=100
Connection: Keep-Alive

Вот как это выглядит при работе через прокси-сервер squid (обратите внимание, что "redirector.mysite.com" не является сайтом, на котором запущен squid или nginx):

http://redirector.mysite.com/?unicmd=g+yreka

GET /?unicmd=g+yreka HTTP/1.1
Host: redirector.mysite.com
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.9) Gecko/20100330                  Fedora/3.5.9-1.fc12 Firefox/3.5.9
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300 
Proxy-Connection: keep-alive
If-Modified-Since: Tue, 13 Apr 2010 05:21:02 GMT 

HTTP/1.0 200 OK
Server: nginx/0.7.62
Date: Tue, 13 Apr 2010 05:21:10 GMT 
Content-Type: text/html
Content-Length: 17865
Last-Modified: Tue, 13 Apr 2010 05:21:10 GMT 
Accept-Ranges: bytes
X-Cache: MISS from jefferson
X-Cache-Lookup: HIT from jefferson:3128
Via: 1.1 jefferson:3128 (squid/2.7.STABLE6)
Connection: keep-alive
Proxy-Connection: keep-alive

Он в основном работает, но URL-адрес http://redirector.mysite.com/?unicmd=g+yreka остается без изменений при отображении страницы Google (в основном не работает, поскольку использует URL-адреса относительно redirector.mysite.com)

Я испытал аналогичную ситуацию со страницами результатов Google: при переходе на другую страницу из Google я получаю URL-адрес Google с содержанием другого сайта.

Извините за длинный пост - большое спасибо, если вы дочитали до этого места! Любые идеи?

Думаю, я понимаю ваше замешательство. Это работает, но не так, как вы ожидали.

SQUID на самом деле не перенаправляет с redirect_program директива, она переписывает. Например:

www.domain.com указывает на IP-адрес, на котором доступен SQUID

SQUID направляет запрос через redirect_program

SQUID перезаписывает www.domain.com/dir1/ на server1 и www.domain.com/dir2/ на server2.

Клиент все время видит одно и то же, так как SQUID не перенаправляет.

Надеюсь, это ясно. Если вам нужна перенаправление, вы можете подумать об использовании Apache mod_rewrite. Он больше подходит для функции перенаправления.