Как я добавляю заголовки без кэшей ко всем 404 страницам, подаваемым апачем и nginx?

Я недавно столкнулся с проблемой после переключения на Cloudflare, и решение состоит в том, чтобы в основном мешать Cloudflare кэшировать 404 ответа.

В нашей сбалансированной с загрузки установке мультисервера происходят случайные 404 с, но они быстро фиксируются rsync (через lsyncd). Перед Cloudflare перезапросом к 404ed файл очень быстро стал бы 200, поскольку rsync делает свое задание.

Однако начиная с кэшей Cloudflare все данные на основе кэширующегося заголовка, и ни апач, ни nginx отправляют заголовок без кэшей в течение 404 с, Cloudflare заканчивает тем, что кэшировал 404 ответа некоторое время.

Я искал решение глобально добавить такой заголовок в течение 404 с и в апаче и в nginx (глобально, для всех размещенных доменов), но до сих пор подошел пробел.

Кто-либо может помочь?

Спасибо.

8
задан 7 May 2015 в 08:07
4 ответа

Разве вы не можете обойтись с помощью директивы error_page, а затем обработать местоположение отдельно с добавленным заголовком?

например в Nginx:

    server {
      ...
      error_page 404 /404.html;
      location = /404.html {
        root   /usr/share/nginx/html;
        add_header Cache-Control "no-cache" always;
      }
    }
5
ответ дан 2 December 2019 в 22:53

Вы также можете сделать это так:

map $status $cache_header {
    default <for_other_codes>;
    404     "no-cache";
}


server {

    [ ... ]

    add_header "Cache-Control" $cache_header always;

}
5
ответ дан 2 December 2019 в 22:53

my five cents on the issue -

in our PHP project we have few 404 pages, so I decide to do it on PHP level using PHP header() function

.
0
ответ дан 2 December 2019 в 22:53

В apache 2.4 вы можете попробовать что-то вроде:

FileETag None
<IfModule mod_headers.c>
    Header always unset ETag "expr=%{REQUEST_STATUS} == 404"
    Header always set Cache-Control "max-age=0, no-cache, no-store, must-revalidate" "expr=%{REQUEST_STATUS} == 404"
    Header always set Pragma "no-cache" "expr=%{REQUEST_STATUS} == 404"
    Header always set Expires "Wed, 11 Jan 1984 05:00:00 GMT" "expr=%{REQUEST_STATUS} == 404"
</IfModule>

always важно, потому что это:

Вы добавляете заголовок в локально сгенерированный неуспешный (не 2xx) ответ, такой как перенаправление, и в этом случае в окончательном ответе используется только таблица, соответствующая always.

Вы сказали все 404, но для полной справки, конечно, это может иметь смысл чтобы обернуть это в или , чтобы ограничить область действия.

Я считаю, что это новая возможность в apache 2.4, поскольку использование условных выражений expr отсутствует в документации mod_headers версии 2.2.

curl -I [foo] тест без этого config:

HTTP/1.1 404 Not Found
Date: Thu, 24 May 2018 17:44:29 GMT
Server: Apache/2.4.18 (Ubuntu)
Content-Type: text/html; charset=iso-8859-1

curl -I [foo] протестируйте с этой конфигурацией:

HTTP/1.1 404 Not Found
Date: Thu, 24 May 2018 17:44:42 GMT
Server: Apache/2.4.18 (Ubuntu)
Cache-Control: max-age=0, no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: Wed, 11 Jan 1984 05:00:00 GMT
Content-Type: text/html; charset=iso-8859-1

Источники:

http://httpd.apache.org/docs/current/mod/mod_headers.html

3
ответ дан 2 December 2019 в 22:53

Теги

Похожие вопросы