trim 模块
该模块用于删除 html , 内嵌 javascript 和 css 中的注释以及重复的空白符。
location / { trim on; trim_js on; trim_css on; }
指令
trim
on
|off
默认:trim off
上下文:http, server, location
使模块有效(失效),删除 html 的注释以及重复的空白符(\n,\r,\t,' ')。
例外:对于 pre
,textarea
,script
,style
和 ie/ssi/esi注释 等标签内的内容不作删除操作。
参数值可以包含变量。
例如:
set $flag "off"; if ($condition) { set $flag "on"; } trim $flag;
trim_js
on
|off
默认:trim_js off
上下文:http, server, location
使模块有效(失效),删除 html 内嵌 javascript 的注释以及重复的空白符(\n,\r,\t,' ')。
例外:对于非javascript代码的 script
标签内容不作删除操作。
参数值可以包含变量。
trim_css
on
|off
默认:trim_css off
上下文:http, server, location
使模块有效(失效),删除 html 内嵌 css 的注释以及重复的空白符(\n,\r,\t,' ')。
例外:对于非css代码的 style
标签内容不作删除操作。
参数值可以包含变量。
trim_types
MIME types
默认:trim_types: text/html
上下文:http, server, location
定义哪些MIME types类型的响应可以被处理。
目前只能处理html格式的页面,js和css只针对于html内嵌的代码,不支持处理单独的js和css页面。
如果这样配置 trim_type text/javascript;
,js代码将被作为html代码来处理而出错。
添加请求参数http_trim=off,将关闭trim功能,返回原始代码,方便对照调试。
格式如下:
http://www.xxx.com/index.html?http_trim=off
原始:
<!DOCTYPE html> <textarea > trim module </textarea > <!--remove all--> <!--[if IE]> trim module <![endif]--> <!--[if !IE ]>--> trim module <!--<![endif]--> <!--# ssi--> <!--esi--> <pre style = "color: blue" >Welcome to nginx!</pre > <script type="text/javascript"> /*** muitl comment ***/ //// single comment str.replace(/ /,"hello"); </script> <style type="text/css" > /*** css comment ! ***/ body { font-size: 20px ; line-height: 150% ; } </style>
结果:
<!DOCTYPE html> <textarea> trim module </textarea> <!--[if IE]> trim module <![endif]--> <!--[if !IE ]>--> trim module <!--<![endif]--> <!--# ssi--> <!--esi--> <pre style="color: blue">Welcome to nginx!</pre> <script type="text/javascript">str.replace(/ /,"hello");</script> <style type="text/css">body{font-size:20px;line-height:150%;}</style>
html
空白符
- 正文中的
\r
直接删除。 - 正文中的
\t
替换为空格,然后重复的空格保留一个。 - 正文中重复的
\n
保留一个。 - 标签中的
\t
,\n
替换为空格,重复的空格保留一个,=
前后的空格直接删除,>
前面的空格直接删除。 - 标签的双引号和单引号内的空白符不做删除。
pre
和texterea
标签的内容不做删除。- 支持
pre
嵌套使用。 script
和style
标签的内容不做删除。- ie条件注释的内容不做删除。
- ssi/esi注释的内容不做删除。
注释
- 如果是ie条件注释不做删除。 判断规则:
<!--[if <![endif]-->
之间的内容判断为ie条件注释。 - 如果是ssi/esi注释的内容不做删除。 判断规则:
<!--# -->
<!--esi -->
之间的内容分别判断为ssi和esi注释。 - 其他正常html注释直接删除.
<!-- -->
javascript
借鉴 jsmin 的处理规则 (http://www.crockford.com/javascript/jsmin.html)
<script type="text/javascript">
或者<script>
标签认为是javascript。
空白符
- '(','[','{',';',',','>','=' 后的 '\n','\t',空格 直接删除。
- '\r' 直接删除。- 其他情况 重复的 '\n','\t',空格 保留第一个。- 单引号和双引号内不删除。
如下不做操作:
- "hello \" world"
- 'hello \' world'- 正则表达式的内容不删除。
- 判断规则:'/' 前的非空字符是 ',','(','=' 三种的即认为是正则表达式。( 同jsmin的判断)
如下不做操作:
var re=/1 2/;
data.match(/1 2/);
注释
- 删除单行注释。
//
- 删除多行注释。/- */
- 注意:javascript也有一种条件注释,不过貌似用得很少,jsmin直接删除的,trim也是直接删除。
- http://en.wikipedia.org/wiki/Conditional_comment
css
借鉴 YUI Compressor 的处理规则 (http://yui.github.io/yuicompressor/css.html)
<style type="text/css">
或者<style>
标签认为是css。
空白符
- ';','>','{','}',':',',' 前后的 '\n','\t',空格 直接删除。- '\r' 直接删除。- 其他情况 连续的 '\n', '\t' 和 空格 保留为一个空格。- 单引号和双引号内不删除。
如下不做操作:
- "hello \\" world"
- 'hello \' world'
注释
- child seletor hack的注释不删除。
html>/**/body p{color:blue}
- IE5 /Mac hack 的注释不删除。/*\*/.selector{color:khaki}/**/
- 其他情况删除注释。/- */