Как я могу обновить .htaccess для условного gzip на лету - PullRequest
1 голос
/ 30 сентября 2019

Примечание

Кто-то предположил, что это дубликат Как обслуживать предварительно сжатые файлы gzip / brotli с .htaccess . Этот вопрос предназначен только для обслуживания предварительно сжатых файлов. Этот вопрос другой. Пожалуйста, смотрите ниже.

Моя цель

Я хочу обслуживать предварительно сжатые файлы brotli, когда они существуют. Если предварительно не сжатый файл brotli не существует, вернитесь к на лету gzip-сжатию.

Текущий код

Я работаю на сайте, который ужеgzip «на лету» включен из файла .htaccess следующим образом:

<ifmodule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/text text/html text/plain text/xml...
</ifmodule>

Модифицированный код

Я установил скрипт сборки, который сжимает многие статические ресурсы с помощью brotli. Чтобы их обслуживать, я заменил вышеуказанный блок mod_deflate на следующий:

<IfModule mod_headers.c>
    # Serve brotli compressed CSS and JS files if they exist
    # and the client accepts brotli.
    RewriteCond "%{HTTP:Accept-encoding}" "br"
    RewriteCond "%{REQUEST_FILENAME}\.br" "-s"
    RewriteRule "^(.*)\.(js|css)"              "$1\.$2\.br" [QSA]

    # Serve correct content types, and prevent double compression.
    RewriteRule "\.css\.br$" "-" [T=text/css,E=no-brotli:1]
    RewriteRule "\.js\.br$"  "-" [T=text/javascript,E=no-brotli:1]

    <FilesMatch "(\.js\.br|\.css\.br)$">
        # Serve correct encoding type.
        Header append Content-Encoding br

        # Force proxies to cache brotli &
        # non-brotli css/js files separately.
        Header append Vary Accept-Encoding
    </FilesMatch>
</IfModule>

Проблема

Служит для файлов в кодировке броутли, когда они существуют, как и ожидалось. Однако проблема, с которой я сейчас сталкиваюсь, заключается в том, что, поскольку оставшиеся ресурсы не кодируются на уровне brotli во время сборки, они теперь обслуживаются без сжатия.

Мне не удалось выяснить, как я могу обслуживать brotliс резервной версией gzip, которая не требует предварительного сжатия для вывода gzip.

Любая помощь приветствуется, спасибо!

1 Ответ

1 голос
/ 30 сентября 2019

Ваша проблема в том, что вы заменили динамический конфиг gzip на статический.

Вам нужны оба бита конфига, но также нужно изменить код Brotli, чтобы установить среду на no-gzip, чтобы она победилаОткат. Ниже должно работать;

<ifmodule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/text text/html text/plain text/xml...
</ifmodule>

<IfModule mod_headers.c>
    # Serve brotli compressed CSS and JS files if they exist
    # and the client accepts brotli.
    RewriteCond "%{HTTP:Accept-encoding}" "br"
    RewriteCond "%{REQUEST_FILENAME}\.br" "-s"
    RewriteRule "^(.*)\.(js|css)"              "$1\.$2\.br" [QSA]

    # Serve correct content types, and prevent double compression.
    RewriteRule "\.css\.br$" "-" [T=text/css,E=no-gzip:1]
    RewriteRule "\.js\.br$"  "-" [T=text/javascript,E=no-gzip:1]

    <FilesMatch "(\.js\.br|\.css\.br)$">
        # Serve correct encoding type.
        Header append Content-Encoding br

        # Force proxies to cache brotli &
        # non-brotli css/js files separately.
        Header append Vary Accept-Encoding
    </FilesMatch>
</IfModule>
...