Заголовок 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 ​​не будет касаться заголовка.

Другие вопросы по тегам