【问题标题】:How to enable gzip compression only for specific path?如何仅为特定路径启用 gzip 压缩?
【发布时间】:2022-01-11 10:30:50
【问题描述】:

我正在尝试在我的 apache 实例 (Apache/2.4.38 (Debian)) 中设置压缩,以便仅在 Request_URI 与一个 api 端点匹配时压缩响应,例如

我想启用压缩:

  • /api/endpoint/123,
  • /api/endpoint/456

但不是为了

  • api/endpoint2/12,
  • api/endpoint/123/action,
  • api/endpoint/test

我确定 mod_deflate 已启用。我的想法是首先使用 no-gzip 变量禁用 gzip,然后在 URI 与正则表达式匹配时删除该变量。我的完整 .htaccess 如下所示:

<IfModule mod_deflate.c>
    SetOutputFilter DEFLATE
    SetEnv no-gzip 1
    SetEnvIf Request_URI "/api/endpoint/\d+$" !no-gzip
</IfModule>
<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # Send Requests To Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

另一个想法是添加一个新的 RewriteRule(在最后一个之前):

    RewriteCond %{REQUEST_URI} !^/api/endpoint/\d+$
    RewriteRule ^ - [E=no-gzip:1]

不幸的是,这些工作都没有,也没有响应被压缩......

【问题讨论】:

标签: apache .htaccess


【解决方案1】:
SetEnv no-gzip 1
SetEnvIf Request_URI "/api/endpoint/\d+$" !no-gzip

SetEnvSetEnvIf 属于单独的 Apache 模块(分别是 mod_env 和 mod_setenvif)。 mod_setenvif 被处理之前 mod_env,尽管配置文件中指令的明显顺序,所以上面总是将no-gzip 设置为1

尝试使用 mod_setenvif 来初始化 no-gzip 环境变量:

SetEnvIf ^ ^ no-gzip

这基本上无条件地将no-gzip 设置为1(默认)(对于任何请求标头)。

(不幸的是,我认为这是无条件使用 mod_setenvif 设置环境变量的最简单方法。)

除此之外:您或许应该将正则表达式锚定在 URL 路径的开头:"^/api/endpoint/\d+$"


更新:

# Send Requests To Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

由于您使用 mod_rewrite 重写 URL,重写过程重新开始,no-gzip env var 将重命名为 REDIRECT_no-gzip。您可以通过在最后一条规则中使用 END 标志而不是 L 来防止重写引擎重新启动(需要 Apache 2.4)。

【讨论】:

  • 感谢您的回答,不幸的是您的回答不起作用,但它给了我一个线索,表明其他模块可能会影响它,我也在使用 mod_rewrite。我已经更新了问题
猜你喜欢
  • 2013-01-08
  • 1970-01-01
  • 2011-02-28
  • 2013-12-29
  • 1970-01-01
  • 2013-05-05
  • 2011-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多