如何在 Apache .htaccess 中使用 SetEnvIfNoCase 禁用 GZip?
How do I disable GZip with SetEnvIfNoCase in Apache .htaccess?
我想为某些页面禁用 GZip。我的 .htaccess
中有这个,但在访问 dashboard/index
.
时它仍然打开 GZip (Content-Encoding: gzip
)
<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/index
、dashboard/index.*
、"/dashboard/index"
等,并尝试了 SetEnvIfNoCase REQUEST_URI ...
,但 GZip 仍然可用。
如果我评论 #AddOutputFilterByType
,那么 GZip 将被关闭。
我正在使用 Apache 2.4.16、Yii 2.0.7,PHP。我在生产中使用 FPM,因此 apache_setenv()
不可用。
您可能正在使用重写来删除 URL 中的 index.php
。由于 SetEnvIf
在请求期间运行的阶段,index.php
将成为使用的 Request_URI
var 的一部分(与 %{REQUEST_URI}
不同)。
现在不使用PATH_INFO
进行重写是很常见的,而只是简单地重写为index.php
,代码只是读取原始的REQUEST_URI
信息。在那种情况下,SetEnvIf
中的 Request_URI
将只是 "index.php",因此您需要在一个特殊的虚拟重写中为该 URL 设置一个标志 env var,并参考它稍后带有 REDIRECT_
前缀(因为在重写时有一个内部重定向阶段,其中 mod_rewrite 为所有现有的环境变量添加前缀 REDIRECT_
):
RewriteRule ^dashboard/index - [E=no-gzip:1]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.php [L]
SetEnvIf REDIRECT_no-gzip 1 no-gzip
如果您重写为 PATH_INFO
(因此“/foobar
”使用例如 RewriteRule (.*) index.php/
规则变为“/index.php/foobar
”,则有一种稍微不那么冗长的方式:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) index.php/ [L]
SetEnvIfNoCase REQUEST_URI ^/index.php/dashboard/index.*$ no-gzip dont-vary
但这似乎更脆弱,因为如果您更改 RewriteRule
机制,它会破裂。
我想为某些页面禁用 GZip。我的 .htaccess
中有这个,但在访问 dashboard/index
.
Content-Encoding: gzip
)
<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/index
、dashboard/index.*
、"/dashboard/index"
等,并尝试了 SetEnvIfNoCase REQUEST_URI ...
,但 GZip 仍然可用。
如果我评论 #AddOutputFilterByType
,那么 GZip 将被关闭。
我正在使用 Apache 2.4.16、Yii 2.0.7,PHP。我在生产中使用 FPM,因此 apache_setenv()
不可用。
您可能正在使用重写来删除 URL 中的 index.php
。由于 SetEnvIf
在请求期间运行的阶段,index.php
将成为使用的 Request_URI
var 的一部分(与 %{REQUEST_URI}
不同)。
现在不使用PATH_INFO
进行重写是很常见的,而只是简单地重写为index.php
,代码只是读取原始的REQUEST_URI
信息。在那种情况下,SetEnvIf
中的 Request_URI
将只是 "index.php",因此您需要在一个特殊的虚拟重写中为该 URL 设置一个标志 env var,并参考它稍后带有 REDIRECT_
前缀(因为在重写时有一个内部重定向阶段,其中 mod_rewrite 为所有现有的环境变量添加前缀 REDIRECT_
):
RewriteRule ^dashboard/index - [E=no-gzip:1]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.php [L]
SetEnvIf REDIRECT_no-gzip 1 no-gzip
如果您重写为 PATH_INFO
(因此“/foobar
”使用例如 RewriteRule (.*) index.php/
规则变为“/index.php/foobar
”,则有一种稍微不那么冗长的方式:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) index.php/ [L]
SetEnvIfNoCase REQUEST_URI ^/index.php/dashboard/index.*$ no-gzip dont-vary
但这似乎更脆弱,因为如果您更改 RewriteRule
机制,它会破裂。