Недавно я столкнулся с проблемой после перехода на Cloudflare, и решение состоит в том, чтобы не дать Cloudflare кэшировать 404 ответа.
В нашей многосерверной настройке с балансировкой нагрузки иногда случаются ошибки 404, но они быстро исправляются с помощью rsync (через lsyncd). До Cloudflare повторный запрос 404-го файла очень быстро превращался в 200, поскольку rsync выполнял свою работу.
Однако, поскольку Cloudflare кэширует все данные на основе заголовка кеширования, и ни apache, ни nginx не отправляют заголовок без кеширования для 404-х годов, Cloudflare на некоторое время кэширует ответ 404.
Я искал решение для глобального добавления такого заголовка для 404 как в apache, так и в nginx (глобально, для всех размещенных доменов), но пока ничего не вышло.
Кто-нибудь может помочь?
Спасибо.
Разве вы не можете обойтись с помощью директивы error_page, а затем обработать местоположение отдельно с добавленным заголовком?
например в Nginx:
server {
...
error_page 404 /404.html;
location = /404.html {
root /usr/share/nginx/html;
add_header Cache-Control "no-cache" always;
}
}
Вы тоже можете сделать это так:
map $status $cache_header {
default <for_other_codes>;
404 "no-cache";
}
server {
[ ... ]
add_header "Cache-Control" $cache_header always;
}
В 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, но для полной справки, конечно, имеет смысл заключить это в <FilesMatch>
или <LocationMatch>
чтобы ограничить объем.
Я считаю, что это новая возможность в apache 2.4, поскольку использование expr
Условных выражений нет в документации mod_headers версии 2.2.
curl -I [foo]
тест без этой конфигурации:
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
Источники:
мои пять центов по этому вопросу -
в нашем PHP-проекте у нас мало 404 страниц, поэтому я решил сделать это на уровне PHP, используя функции PHP header ()