Possuir arquivos com querystring incluídos em seus nomes. Precisa de nginx para ignorar querystring para o cabeçalho do conteúdo

2

Tenha um diretório com muitos arquivos. Estes são todos os arquivos estáticos dos backups.

A questão é que alguns arquivos são nomeados da seguinte forma:

mystyle.css?version=3.3.1

Ao servir os arquivos, o nginx não está detectando que o arquivo é um css e, portanto, não envia o cabeçalho Content-Type: text/css e está me dando alguns problemas. É muito problemático para renomear os arquivos, uma vez que seria necessário renomear uma tonelada de arquivos, ao mesmo tempo, renomear-los dentro de html, javascript, etc. Poderia ser possível ajudar nginx em ignorar o? e o resto da string de consulta e só verifica mystyle.css para a determinação do tipo de mimetype para servir?

Isso é particularmente problemático para coisas como imagens SVG, já que os navegadores não as detectam como tal, a menos que você as atenda como image/svg+xml , mas isso também causa problemas em outras situações.

    
por Mamsaac 06.10.2018 / 03:45

1 resposta

2

O Nginx analisa o nome do arquivo final e conclui que a extensão é css?version=3.3.1 . Ele aparece no bloco types e não encontra correspondência, então o valor de default_type é usado.

Se você tiver todos os arquivos do tipo CSS em uma pasta e todos os arquivos do tipo SVG em outro - ou se o caminho URI para diferentes tipos for exclusivo, você poderá definir o tipo mime para todos os arquivos em um local específico:

location /css {
    types { }
    default_type text/css;
}

Na primeira linha da sua pergunta, você indica que há um diretório com muitos arquivos, presumivelmente com diferentes tipos de mime.

Você pode usar uma diretiva map com uma expressão regular para identificar o tipo mime dos arquivos. Você precisará adicionar uma linha para cada tipo de arquivo contido no diretório. Meu exemplo contém apenas alguns. O arquivo /etc/nginx/mime.types contém os tipos que o Nginx geralmente está configurado para reconhecer, mas você só precisará adicionar os tipos de arquivos que você arquiva atualmente neste diretório.

map $request_uri $type {
    default         application/octet-stream;
    ~*\.css         text/css;
    ~*\.js          application/javascript;
}

server {
    ...
    location /some/path {
        default_type "";
        types { }
        add_header Content-Type $type;
    }
}

AVISO LEGAL: Este é provavelmente um hack, mas parece funcionar.

Configurar o default_path para uma string vazia junto com um bloco types vazio, impede que o Nginx adicione seu próprio cabeçalho Content-Type.

Consulte este documento para obter detalhes sobre a diretiva map .

    
por 06.10.2018 / 16:26