Заголовок nginx, связанный с типом содержимого
Можно ли установить заголовок expires в зависимости от типа содержимого в nginx? Я новичок в nginx и попробовал следующее:
location ~ /files\.php$ {
...
if ($content_type = "text/css") {
add_header X-TEST1 123;
expires 7d;
}
if ($content_type = "image/png") {
add_header X-TEST2 123;
expires 30d;
}
if ($content_type = "application/javascript") {
add_header X-TEST3 123;
expires 1d;
}
#testing
if ($content_type != "text/css") {
add_header X-TEST4 abc;
}
#testing
if ($content_type = text/css) {
add_header X-TEST5 123;
}
}
Но единственный добавленный заголовок - "X-TEST4" для всех запросов. Я знаю о другом решении, используя расширение файла:
location ~* \.(ico|css|js|gif|jp?g|png)\?[0-9]+$
Но это не относится к моему заявлению.
3 ответа
Ты пытался
$content_type ~= application/javascript
Кроме того, обязательно прочитайте это: http://wiki.nginx.org/IfIsEvil
Я думаю, что код должен быть в location / { }
вместо location ~ /files\.php$ { }
...
Если у вас установлен модуль lua, вы можете сделать что-то похожее на это:
server {
location / {...}
header_filter_by_lua_block {
local cct = {} -- # cached content types
cct["text/css"] = true
cct["application/javascript"] = true
cct["application/x-javascript"] = true
cct["text/javascript"] = true
cct["image/jpeg"] = true
cct["image/png"] = true
cct["application/vnd.ms-fontobject"] = true
cct["application/font-woff"] = true
cct["application/x-font-truetype"] = true
cct["image/svg+xml"] = true
cct["application/x-font-opentype"] = true
if cct[ngx.header.content_type] ~= nil and ngx.header["expires"] == nil then
local now = os.time()
local expires = os.date("%a, %d-%b-%Y %H:%I:%S GMT", now+604800) -- # one week in seconds
ngx.header["expires"] = expires
end
}
}
Ответы с указанным типом содержимого теперь получат заголовок expires. Когда ответ уже имеет заголовок expires, блок lua не будет касаться заголовка.