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

Обратный прокси-сервер Apache не сохраняет заголовки

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

Позволь мне объяснить...

В настоящее время я использую PHP Slim для создания API для своего веб-приложения. У него есть собственные механизмы кэширования, которые настроены и работают нормально. Итак, при посещении ресурса api.example.com/info например, у меня есть Последнее изменение который установлен, что позволяет его кэшировать (он не меняется очень часто).

Таким образом, заголовки выглядят примерно так:

Request URL:http://api.example.com/info
Request Method:GET
Status Code:304 Not Modified

Заголовки запроса

Accept:text/html,application/xhtml xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-GB,en-US;q=0.8,en;q=0.6
Cache-Control:max-age=0
Connection:keep-alive
Host:api.example.com
If-Modified-Since:Mon, 04 Oct 2010 08:00:52  1100
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5

Заголовки ответа

Connection:Keep-Alive
Date:Tue, 19 Jun 2012 22:34:45 GMT
Keep-Alive:timeout=5, max=100
Server:Apache/2.2.21 (Win64) PHP/5.3.8
Vary:Accept-Encoding

Это показывает, что ресурс возвращается с 304 - он был получен из кеша. Большой!

Однако веб-приложение обращается к нему через обратный прокси-сервер (кросс-доменные проблемы). При доступе к тому же самому ресурсу, на этот раз из app.example.com/api/info, он возвращается с кодом 200. Он также заметно медленнее загружается, что заставляет меня думать, что что-то не работает.

На этот раз заголовки

Request URL:http://app.example.com/api/info
Request Method:GET
Status Code:200 OK

Заголовки запроса

Accept:text/html,application/xhtml xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-GB,en-US;q=0.8,en;q=0.6
Cache-Control:max-age=0
Connection:keep-alive
Host:app.example.com
If-Modified-Since:Mon, 04 Oct 2010 08:00:52 GMT
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5

Заголовки ответа

Connection:Keep-Alive
Content-Encoding:gzip
Content-Length:1959
Content-Type:application/json
Date:Tue, 19 Jun 2012 22:41:01 GMT
Keep-Alive:timeout=5, max=100
Last-Modified:Mon, 04 Oct 2010 08:00:52 GMT
Server:Apache/2.2.21 (Win64) PHP/5.3.8
Vary:Accept-Encoding
X-API-Version:v1.0
X-Powered-By:PHP/5.3.8, Slim

Любые идеи? Извините за массу информации в заголовке выше - не хотел упускать какую-либо информацию.

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

например второй ответ (через прокси) включает

Content-Encoding:gzip

Линия. Возможно, ваш обратный прокси-сервер добавляет фильтр сжатия gzip перед выдачей результатов. Что может означать: ваш основной ресурс не изменился, но прокси-сервер изменяет содержимое, сжимая его, и поэтому он помечает это как «новое содержимое».

Другое отличие заключается в вашем запросе: в вашем первом запросе вы отправляете:

If-Modified-Since:Mon, 04 Oct 2010 08:00:52 +1100

но в вашем втором запросе timeoffset +1100 отсутствует, поэтому вы отправляете другое время модификации.