如何在Apache .htaccess中使用SetEnvIfNoCase禁用GZip?

时间:2016-03-24 22:38:15

标签: apache .htaccess gzip setenvif

我想为某些页面禁用GZip。我在我的.htaccess中有此内容,但在访问Content-Encoding: gzip时仍会启用GZip(dashboard/index)。

<ifmodule mod_deflate.c>
  AddOutputFilterByType DEFLATE text/text text/html text/plain text/xml text/css application/x-javascript application/javascript
  BrowserMatch ^Mozilla/4 gzip-only-text/html
  BrowserMatch ^Mozilla/4\.0[678] no-gzip
  BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
  SetEnvIfNoCase Request_URI /dashboard/index no-gzip dont-vary

我尝试添加Header set MyHeader %{REQUEST_URI}以查看Request_URI是什么,但它给出了内部服务器错误。

我还尝试了正则表达式dashboard/indexdashboard/index.*"/dashboard/index"等,并尝试SetEnvIfNoCase REQUEST_URI ...,但GZip仍在使用。

如果我评论#AddOutputFilterByType,则GZip会被关闭。

我正在使用Apache 2.4.16,Yii 2.0.7,PHP。我在制作中使用FPM,因此apache_setenv()不可用。

1 个答案:

答案 0 :(得分:1)

您可能正在使用重写来删除网址中的index.php。由于SetEnvIf在请求期间运行的阶段,index.php将成为所使用的Request_URI var的一部分(与%{REQUEST_URI}不同)。

现在很常见的是不使用PATH_INFO进行重写,但只是简单地重写为index.php,其中代码只读取原始的REQUEST_URI信息。在这种情况下,Request_URI中的SetEnvIf将只是&#34; index.php&#34;,因此您需要在该网址的特殊虚拟重写中设置标志env var ,稍后用REDIRECT_前缀引用它(因为重写时有一个内部重定向阶段,其中mod_rewrite为REDIRECT_所有现有的env变量添加前缀):

RewriteRule ^dashboard/index - [E=no-gzip:1]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.php [L]
SetEnvIf REDIRECT_no-gzip 1 no-gzip

如果您重写为PATH_INFO,则会略显冗长(所以&#34; /foobar&#34;转向&#34; /index.php/foobar&#34;使用例如RewriteRule (.*) index.php/$1规则):

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) index.php/$1 [L]
SetEnvIfNoCase REQUEST_URI ^/index.php/dashboard/index.*$ no-gzip dont-vary

但这似乎更脆弱,因为如果你改变RewriteRule机制,它就会中断。