【问题标题】:How to serve precompressed gzip/brotli files with .htaccess如何使用 .htaccess 提供预压缩的 gzip/brotli 文件
【发布时间】:2017-09-29 11:11:57
【问题描述】:

我正在尝试为 html、js 和 css 提供预压缩的 gzip/brotli 文件。 使用以下代码。

RewriteEngine on

    # Brotli
    # If the web browser accept brotli encoding… 
    RewriteCond %{HTTP:Accept-encoding} br
    # …and the web browser is fetching a probably pre-compressed file…
    RewriteCond %{REQUEST_URI} .*\.(css|html|js)
    # …and a matching pre-compressed file exists… 
    RewriteCond %{REQUEST_FILENAME}.br -s
    # …then rewrite the request to deliver the brotli file
    RewriteRule ^(.+) $1.br
    # For each file format set the correct mime type (otherwise brotli mime type is returned) and prevent Apache for recompressing the files
    RewriteRule "\.css\.br$" "-" [T=text/css,E=no-brotli,E=no-gzip]
    RewriteRule "\.html\.br$" "-" [T=text/html,E=no-brotli,E=no-gzip]
    RewriteRule "\.js\.br$" "-" [T=application/javascript,E=no-brotli,E=no-gzip]

    # Gzip
    # If the web browser accept gzip encoding… 
    RewriteCond %{HTTP:Accept-Encoding} gzip
    # …and the web browser is fetching a probably pre-compressed file…
    RewriteCond %{REQUEST_URI} .*\.(css|html|js)
    # …and a matching pre-compressed file exists… 
    RewriteCond %{REQUEST_FILENAME}.gz -s
    # …then rewrite the request to deliver the gzip file
    RewriteRule ^(.+) $1.gz
    # For each file format set the correct mime type (otherwise gzip mime type is returned) and prevent Apache for recompressing the files
    RewriteRule "\.css\.gz$" "-" [T=text/css,E=no-brotli,E=no-gzip]
    RewriteRule "\.html\.gz$" "-" [T=text/html,E=no-brotli,E=no-gzip]
    RewriteRule "\.js\.gz$" "-" [T=application/javascript,E=no-brotli,E=no-gzip]

    <FilesMatch "\.(css|html|js)\.br$">
        # Prevent mime module to set brazilian language header (because the file ends with .br)
        RemoveLanguage .br
        # Set the correct encoding type
        Header set Content-Encoding br
        # Force proxies to cache brotli & non-brotli files separately
        Header append Vary Accept-Encoding
    </FilesMatch>
    <FilesMatch "\.(css|html|js)\.gz$">
        # Serve correct encoding type
        Header set Content-Encoding gzip
        # Force proxies to cache gzip & non-gzip files separately
        Header append Vary Accept-Encoding
    </FilesMatch>

我的文件夹结构如下所示:

  • .htaccess
  • index.php
  • /css/
  • /css/main.css
  • /css/main.css.gz
  • /css/main.css.br

但我在使用上面的代码时得到 404。

【问题讨论】:

    标签: apache .htaccess url-rewriting gzip brotli


    【解决方案1】:

    设置 RewriteBase 修复它。

    RewriteBase /
    

    【讨论】:

      【解决方案2】:

      写这篇文章是为了帮助别人。我必须在 RewriteCond 中添加 %{DOCUMENT_ROOT} 才能使其正常工作。

      本质上,将所有RewriteCond 更改为

      RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME}\.br -s
      

      【讨论】:

        【解决方案3】:

        对我来说,问题是 http 连接不支持 brotli 压缩。见Why is Brotli not supported on HTTP?

        【讨论】:

          最近更新 更多