我有一个流量相当高的网络服务器,想从中进行一些微优化。
在 Apache 的配置中我有:
SetEnvIfNoCase Request_URI "\.a?png$" dontlog
SetEnvIfNoCase Request_URI "\.bmp$" dontlog
SetEnvIfNoCase Request_URI "\.css$" dontlog
...several more
我想实现这一点(伪代码):
<If env=!dontlog>
SetEnvIfNoCase Request_URI "\.a?png$" dontlog
</If>
<If env=!dontlog>
SetEnvIfNoCase Request_URI "\.bmp$" dontlog
</If>
<If env=!dontlog>
SetEnvIfNoCase Request_URI "\.css$" dontlog
</If>
...several more
使用我的伪代码执行配置测试的结果如下:
AH00526:C:/apache24/conf/httpd.conf 第 260 行语法错误:无法解析条件子句:语法错误,意外的 T_OP_STR_EQ,预期为“(”
笔记:
请忽略示例中正则表达式的琐碎之处。我该如何执行短路?
答案1
SetEnvIfNoCase
以不区分大小写的方式执行正则表达式匹配。
因此,您不需要寻找复杂的解决方法来避免处理单独的SetEnvIfNoCase
测试和多个简单的正则表达式,而是将测试简化为一个稍微复杂一些的正则表达式,以匹配所有您不想记录的文件扩展名。
SetEnvIfNoCase Request_URI "\.(?:jpe?g|css|bmp|a?png)$" dontlog
还可以考虑在单独的子域中存储和提供图像。如果您认为记录会带来不必要的性能损失,则可以配置不带任何记录的 VirtualHost,这样就完全避免了单独测试请求是否应该记录的需要。
人们声称图像/静态内容子域名将提高页面速度,因为浏览器可以打开到子域名的附加连接,您不必在那里设置/处理 cookie 等等。即使您不想为您的主站点使用 CDN,您仍然可以轻松地将其用于您的静态内容。