mod_include
描述: | Server-parsed html 文档(服务器端包含) |
状态: | Base |
模块标识符: | include_module |
源文件: | mod_include.c |
摘要
此模块提供了一个过滤器,它将 process files 发送到 client 之前。处理由特殊格式的 SGML comments 控制,称为元素。这些元素允许条件文本,包含其他 files 或程序,以及环境变量的设置和打印。
启用 Server-Side 包含
服务器端包含由INCLUDES
过滤实现。如果包含 server-side include 指令的文档的扩展名为.shtml,则以下指令将使 Apache 解析它们并为结果文档指定 mime 类型text/html
:
AddType text/html .shtml AddOutputFilter INCLUDES .shtml
必须为包含 shtml files 的目录指定以下指令(通常在<Directory>部分中,但如果设置了AllowOverrideOptions
,则此指令在.htaccess
files 中也有效):
Options +Includes
为了向后兼容,server-parsed
处理器还会激活 INCLUDES 过滤器。同样,Apache 将为 mime 类型为text/x-server-parsed-html
或text/x-server-parsed-html3
的任何文档激活 INCLUDES 过滤器(结果输出将具有 mime 类型text/html
)。
有关更多信息,请参阅我们的服务器端包含教程。
PATH_INFO 与服务器端包含
_为 server-side 处理的文件包括默认情况下不再接受带有PATH_INFO
(尾随路径名信息)的请求。您可以使用中的 AcceptPathInfo指令将服务器配置为接受PATH_INFO
的请求。
可用元素
该文档被解析为 HTML 文档,其中特殊命令嵌入为 SGML comments。命令具有以下语法:
<!--#element attribute=value attribute=value ...-->
value 通常用 double 引号括起来,但单引号('
)和反引号(```)也是可能的。许多命令只允许一对 attribute-value 对。请注意,comment 终止符(-->
)前面应该有空格,以确保它不被视为 SSI 令牌的一部分。请注意,前导<!--#
是一个标记,可能不包含任何空格。
允许的元素列在以下 table 中:
元件 | 描述 |
评论 | SSI comment |
配置 | 配置输出格式 |
回声 | 打印变量 |
EXEC | 执行外部程序 |
FSIZE | 打印文件的大小 |
flastmod | 打印文件的最后修改 time |
包括 | 包含一个文件 |
printenv | 打印所有可用变量 |
组 | 设置变量的 value |
SSI 元素可以由mod_include以外的模块定义。实际上,EXEC元素由mod_cgi提供,并且只有在加载此模块时才可用。
comment 元素
此命令不输出任何内容。它唯一的用途是在文件中添加 comments。这些 comments 不会打印出来。
此语法在 version 2.4.21 及更高版本中可用。
<!--#comment Blah Blah Blah -->
配置元素
此命令控制解析的各个方面。有效属性是:
echomsg
(Apache 2.1 及以后)
如果 echo 元素尝试回显未定义的变量,则 value 是一条发送回 client 的消息。这会覆盖任何 SSIUndefinedEcho 指令。<!--#config echomsg =“[ Value Undefined]”-->errmsg
value 是在解析文档时发生错误时发送回 client 的消息。这会覆盖任何 SSIErrorMsg 指令。<!--#config errmsg =“[哎呀,东西坏了。]”-->sizefmt
value 设置显示文件大小时要使用的格式。有效值是以字节为单位的字节数,或者是适当的以 Kb 或 Mb 为单位的缩写,例如,1024 字节的大小将打印为“1K”。<!--#config sizefmt =“abbrev”-->timefmt
value 是 strftime(3)library 例程在打印日期时使用的 string。<!--#config timefmt =“”%R,%B%d,%Y“”-->
回声元素
此命令打印下面定义的包含变量之一。如果未设置变量,则结果由SSIUndefinedEcho指令确定。打印的任何日期都取决于当前配置的timefmt
。
属性:
var
value 是要打印的变量的 name。decoding
指定 Apache 是否应在进一步处理变量之前从变量中删除编码。默认值为 none,不进行解码。如果设置为 url,则 URL 解码(也称为%-encoding;这适用于链接中的 URL,etc.)将被执行。如果设置为 urlencoded,application/x-www-form-urlencoded 兼容编码(在查询 strings 中找到)将被剥离。如果设置对于 base64,base64 将被解码,如果设置为 entity,将剥离 HTML 实体编码。在对变量进行任何进一步编码之前进行解码。可以通过指定多个逗号分隔编码来剥离多个编码。解码设置在遇到下一个解码属性或元素 ends 之前,它将保持有效。解码属性必须在相应的 var 属性之前才有效。encoding
指定 Apache 在输出变量之前应如何编码变量中包含的特殊字符。如果设置为 none,则不会进行编码。如果设置为 url,则 URL 编码(也称为%-encoding;这适用于链接中的 URL,etc.)将被执行。如果设置为 urlencoded,则将执行 application/x-www-form-urlencoded 兼容编码,并应与查询 strings 一起使用如果设置为 base64,将执行 base64 编码。在 echo 元素的开头,默认设置为 entity,从而产生实体编码(适用于 block-level HTML 元素的 context,e.g.一段文本这可以通过添加一个编码属性来改变,该属性在遇到下一个编码属性或元素 ends 之前将保持有效,以先到者为准。编码属性必须在相应的 var 属性之前才有效。在 order 中要避免 cross-site 脚本问题,您应该始终对用户提供的数据进行编码.Example <!--#echo encoding =“entity”var =“QUERYSTRING”-->
exec 元素
exec
命令执行给定的 shell 命令或 CGI 脚本。它需要mod_cgi存在于服务器中。如果设置了选项IncludesNOEXEC
,则完全禁用此命令。有效属性是:
cgi
value 指定 CGI 脚本的(%-encoded)URL-path。如果路径不以斜杠开头(/),那么它将被认为是相对于当前文档。此路径引用的文档作为 CGI 脚本调用,即使服务器通常不会识别它。,必须为 CGI 脚本启用包含脚本的目录(使用 ScriptAlias 或 Options ExecCGI)。CGI 脚本从 client 获得原始请求的 PATH_INFO 和查询 string(QUERYSTRING);这些不能在 URL 路径中指定。除了标准 CGI 环境之外,脚本还可以使用包含变量。例如<!--#exec cgi =“/cgi-bin/example.cgi”-->如果脚本返回 Location:标头而不是输出,那么这将被转换为 HTML 锚点。应优先使用 include 虚拟元素 to exec cgi。特别是,如果你需要使用查询 string 将额外的 arguments 传递给 CGI 程序,这不能用 exec cgi 完成,但可以用 include virtual 完成,如下所示:<!--#include virtual =“/cgi-bin/example.cgi?argument=value”-->cmd
服务器将使用/bin/sh 执行给定的 string。除了通常的 CGI 变量集之外,命令还可以使用包含变量。#include virtual 的使用几乎总是优先使用#exec cgi 或#exec cmd。前者(#include virtual)使用标准的 Apache sub-request 机制来包含 files 或脚本。它的测试和维护要好得多。此外,在某些平台(如 Win32)和使用 suexec 的 unix 上,您无法将 arguments 传递给 exec 指令中的命令,或者在命令中包含空格。因此,虽然以下内容将在 unix 上的 non-suexec configuration 下工作,但它不会在 Win32 下产生所需的结果,或者 running suexec:<!--#exec cmd =“perl /path/to/perlscript arg1 arg2”-->
fsize 元素
此命令打印指定文件的大小,具体取决于sizefmt
格式规范。属性:
file
value 是相对于包含要解析的当前文档的目录的路径。该文件是<!--#fsize file =“mod_include.html”-->字节。文件的 value 不能以斜杠开头(/),也不能包含../,以便引用当前目录上方或文档根目录之外的文件。尝试这样会导致错误消息:给定路径在上面根路径。virtual
value 是一个(%-encoded)URL-path。如果它不是以斜杠开头(/)那么它被认为是相对于当前文档。注意,这不会打印任何 CGI 输出的大小,而是 CGI 脚本本身的大小。
This file is <!--#fsize virtual="/docs/mod/mod_include.html"--> bytes.
请注意,在许多情况下,这两者完全相同。但是,file
属性不尊重 URL-space 别名。
flastmod 元素
此命令打印指定文件的最后修改 date,具体取决于timefmt
格式规范。属性与FSIZE命令的属性相同。
包含元素
此命令将另一个文档或文件的文本插入到已解析的文件中。任何包含的文件都受通常的访问控制。如果包含已解析文件的目录设置为选项IncludesNOEXEC
,则仅包含文本MIME-type(text/plain
,text/html
etc.)的文档。否则,将使用命令中给出的完整 URL(包括任何查询 string)正常调用 CGI 脚本。
属性定义文档的位置,并且可以在 include 元素中出现多次;对依赖于 include 命令的每个属性进行包含。有效属性是:
file
value 是相对于包含要解析的当前文档的目录的路径。它不能包含../,也不能是绝对路径。因此,您不能包含文档根目录之外的 files,也不能包含目录结构中当前文档之上的 files。应始终优先使用虚拟属性。- 虚拟
value 是一个(%-encoded)URL-path。 URL 不能包含 scheme 或主机名,只能包含路径和可选查询 string。如果它不以斜杠开头(/)那么它被认为是相对于当前文档。一个 URL 是从属性构造的,如果 client 访问了 URL,服务器将返回的输出包括在解析中因此包含 files 可以嵌套。如果指定的 URL 是 CGI 程序,程序将被执行并且其输出被插入代替解析文件中的指令。您可以在 CGI url 中包含查询 string:<!--#include virtual =“/cgi-bin/example.cgi?argument=value”--> include virtual 应优先于 exec cgi 使用,以将 CGI 程序的输出包含到 HTML 文档中。如果 KeptBodySize 指令已正确配置并对此包含文件有效,则尝试将 POST 请求发送到封闭的 HTML 文档将传递给子请求作为 POST 请求。如果没有该指令,所有子请求都将作为 GET 请求处理。 onerror
value 是一个(%-encoded)URL-path,如果先前尝试包含文件或虚拟属性失败,则显示该值。要生效,必须在覆盖文件或虚拟属性后指定此属性。如果尝试包含 onerror 路径失败,或者未指定 onerror,则将包含默认错误消息。#Simple example <!--#include virtual =“/not-exist.html”onerror =“/error.html”-->#Dedicated onerror paths <!--#include virtual =“/path-a.html”onerror =“/error-a.html”virtual =“/path-b.html”onerror =“/error-b.html”-->
printenv 元素
这将打印出所有现有变量及其值的纯文本列表。特殊字符在输出之前是实体编码的(有关详细信息,请参阅回声元素)。没有属性。
例
<pre><!--#printenv --></pre>
设置元素
这设置了变量的 value。属性:
var
要设置的变量的 name。value
value 给出一个变量。decoding
指定 Apache 是否应在进一步处理变量之前从变量中删除编码。默认值为 none,不进行解码。如果设置为 url,urlencoded,base64 或实体,则将分别执行 URL 解码,application/x-www-form-urlencoded 解码,base64 解码或 HTML 实体解码。可以通过用逗号分隔来指定多个解码。解码设置将一直有效,直到遇到下一个解码属性或元素 ends 为止。解码属性必须在相应的 var 属性之前才有效。encoding
指定 Apache 在设置变量之前应如何编码变量中包含的特殊字符。默认值为 none,不进行编码。如果设置为 url,则 urlencoding,base64 或 entity,URL 编码,application/x-www-form-urlencoded 编码,base64 编码或 HTML 实体编码将分别执行。可以通过逗号分隔来指定多个编码。编码设置将保持有效,直到遇到下一个编码属性或元素 ends。 encoding 属性必须在相应的 var 属性之前才有效。在剥离所有解码后应用编码。
例
<!--#set var="category" value="help"-->
包括变量
除了标准 CGI 环境中的变量之外,这些变量还可用于echo
命令,if
和elif
以及文档调用的任何程序。
DATE_GMT
Greenwich 中的当前日期意味着 Time。DATE_LOCAL
本地 time zone 中的当前 date。DOCUMENT_ARGS
此变量包含 active SSI 文档的查询 string,如果未包含查询 string,则为空 string。对于通过 include SSI 指令调用的子请求,QUERYSTRING 将表示子请求的查询 string,DOCUMENT_ARGS 将表示 SSI 文档的查询 string。(在 Apache HTTP Server 2.4.19 和 later.)中可用DOCUMENT_NAME
用户请求的文档的文件名(不包括目录)。DOCUMENT_PATH_INFO
尾随路径名信息。有关 PATH_INFO 的更多信息,请参阅指令 AcceptPathInfo。DOCUMENT_URI
用户请求的文档的(%-decoded)URL 路径。请注意,对于嵌套的包含 files,这不是当前文档的 URL。另请注意,如果在内部修改 URL(e.g.通过别名或 directoryindex),则会显示修改后的 URL。LAST_MODIFIED
用户请求的文档的最后修改 date。QUERY_STRING_UNESCAPED
如果 active SSI 文档的请求中存在查询 string,则此变量包含(%-decoded)查询 string,该查询 string 将被转义以供 shell 使用(特殊字符,如&等,前面有反斜杠)。如果查询 string 不存在,则不会设置它。如果不需要 shell 转义,请使用 DOCUMENT_ARGS。USER_NAME
文件所有者的用户 name。
可变替代
在大多数情况下,变量替换是在引用的 strings 内完成的,它们可能合理地作为 SSI 指令的参数出现。这包括config
,exec
,flastmod
,fsize
,include
,echo
和set
指令。如果SSILegacyExprParser设置为on
,则在条件操作符的 arguments 中也会发生替换。您可以使用反斜杠引号将 string 美元符号插入 string:
<!--#set var="cur" value="\$test"-->
如果一个变量 reference 需要在一个字符序列的中间被替换,否则它本身可能被认为是一个有效的标识符,它可以通过将 reference 括在大括号中来消除歧义,一个 la shell 替换:
<!--#set var="Zed" value="${REMOTE_HOST}_${REQUEST_METHOD}"-->
如果REMOTE_HOST
是“X
”且REQUEST_METHOD
是“Y
”,这将导致Zed
变量设置为“X_Y
”。
流量控制元素
基本的流量控制元素是:
<!--#if expr="test_condition"--><!--#elif expr="test_condition"--><!--#else --><!--#endif -->
if
元素的作用类似于编程语言中的 if 语句。评估测试条件,如果结果是 true,则直到下一个elif
,else
或endif
元素的文本包含在输出流中。
如果原始 test_condition 是 false,elif
或else
statements 用于将文本放入输出流。这些元素是可选的。
endif
元素_end if
元素并且是必需的。
test_condition 是一个 boolean 表达式,它遵循ap_expr语法。可以使用SSILegacyExprParser将语法更改为与 Apache HTTPD 2.2.x 兼容。
使用var
元素设置的 SSI 变量将导出到请求环境中,并可使用reqenv
function 访问。作为 short-cut,function name v
也可以在mod_include中使用。
如果 client IP 地址属于 10.0.0.0/8 子网,则下面的 example 将打印“from local net”。
<!--#if expr='-R "10.0.0.0/8"'--> from local net <!--#else --> from somewhere else <!--#endif -->
如果变量foo
设置为 value“bar”,则下面的 example 将打印“foo is bar”。
<!--#if expr='v("foo")="bar"'--> foo is bar <!--#endif -->
参考文献
另请参阅:Apache HTTP Server 中的表达式,以获取完整的 reference 和示例。限制功能在mod_include内不可用
Legacy 表达式语法
如果SSILegacyExprParser设置为on
,本节将介绍#if expr
元素的语法。
string
true 如果 string 不为空-A string
true 如果 string 表示的 URL 可由 configuration 访问,否则返回 false。如果要向未授权查看 URL 的用户隐藏页面上的内容(例如指向该 URL 的链接),这将非常有用。请注意,仅测试 URL 是否授予访问权限,而不是 URL 是否存在。 Example <!--#if expr =“-A /private”-->单击<a href="/private"> here </a>以访问私人信息。<!--#万一-->string1 = string2 string1 == string2 string1 != string2
比较 string1 和 string2。如果 string2 的格式为/string2/,那么它将被视为正则表达式。正则表达式由 PCRE 引擎实现,并且具有与 perl 5 中相同的语法。请注意,==只是=的别名,并且行为完全相同。如果匹配正数(=或==),则可以捕获正则表达式的分组部分。捕获的部分存储在特殊变量$1 ..$9 中。正则表达式匹配的整个 string 存储在特殊变量$0 Example 中<!--#if expr =“$QUERYSTRING =/^ sid =([a-zA-Z0-9])/”--><!--#set var =“ session”value =“$1”--><!--#万一-->string1 < string2 string1 <= string2 string1 > string2 string1 >= string2
将 string1 与 string2 进行比较。注意,strings 按字面比较(使用 strcmp(3))。因此 string“100”小于“20”。(test_condition)
true 如果 test_condition 是 true! test_condition
true 如果 test_condition 是 falsetest_condition1 && test_condition2
true 如果 test_condition1 和 test_condition2 都是 truetest_condition1 || test_condition2
true 如果 test_condition1 或 test_condition2 是 true
“=
”和“!=
”绑定比“&&
”和“||
”更紧密。“!
”绑定最紧密。因此,以下是等价的:
<!--#if expr="$a = test1 &&$b = test2"--><!--#if expr="($a = test1)&&($b = test2)"-->
boolean operators &&
和||
共享相同的优先级。因此,如果您想更紧密地绑定这样的 operator,您应该使用括号。
任何未被识别为变量或 operator 的东西都被视为 string。 Strings 也可以引用:'string'
。不带引号的 strings 不能包含空格(空格和制表符),因为它用于分隔变量等标记。如果连续找到多个 strings,则使用空格连接它们。所以,
string1 string2
结果string1 string2
和
'string1 string2'
导致string1 string2
。
Boolean 表达式的优化
如果表达式变得更复杂并且显着减慢了处理速度,您可以尝试根据 evaluation 规则对它们进行优化:
- 表达式从左到右进行评估
- 二进制 boolean operators(
&&
和||
)尽可能短路。总结上述规则意味着,mod_include首先评估左表达式。如果左侧结果足以确定最终结果,则处理在此处停止。否则,它会评估右侧并计算左右结果的最终结果。 - 短路 evaluation 被关闭为 long,因为有正则表达式要处理。必须对这些进行求值以填充反向引用变量(
$1
..$9
)。
如果要查看特定表达式的处理方式,可以使用-DDEBUG_INCLUDE
编译器选项重新编译mod_include。这将插入每个已解析的表达式标记生成器信息,解析树以及如何将其计算到发送到 client 的输出中。
在正则表达式 strings 中转义斜杠
必须转义所有不用作正则表达式中的分隔符的斜杠。这与正则表达式引擎无关。
SSIEndTag 指令
描述: | String 表示包含元素 |
句法: | SSIEndTag tag |
默认: | SSIEndTag "-->" |
Context: | server config,virtual host |
状态: | Base |
模块: | mod_include |
该指令更改mod_include查找的 string 以标记 include 元素的结尾。
SSIEndTag "%>"
参见
- SSIStartTag
SSIErrorMsg 指令
描述: | 出现 SSI 错误时显示错误消息 |
句法: | SSIErrorMsg message |
默认: | SSIErrorMsg "[an error occurred while processing this directive]" |
Context: | server config,virtual host,directory,.htaccess |
覆盖: | 所有 |
状态: | Base |
模块: | mod_include |
SSIErrorMsg
指令更改mod_include遇到错误时显示的错误消息。对于 production 服务器,您可以考虑将默认错误消息更改为"<!-- Error -->"
,以便不向用户显示消息。
该指令与<!--#config errmsg=message -->
元素具有相同的效果。
SSIErrorMsg "<!-- Error -->"
SSIETag 指令
描述: | 控制是否由服务器生成 ETag。 |
句法: | SSIETag on\|off |
默认: | SSIETag off |
Context: | 目录,.htaccess |
状态: | Base |
模块: | mod_include |
兼容性: | 可在 version 2.2.15 及更高版本中使用。 |
在正常情况下,由mod_include过滤的文件可能包含动态生成的元素,或者可能独立于原始文件而更改的元素。因此,默认情况下,要求服务器不要通过向请求注释添加no-etag
来为响应生成ETag
标头。
SSIETag
指令禁止此行为,并允许服务器生成ETag
标头。这可用于启用输出的缓存。请注意,后端服务器或动态内容 generator 可能会生成自己的 ETag,忽略no-etag
,并且无论此设置的 value 如何,此 ETag 都将由mod_include传递。SSIETag
可以采用以下值:
off
no-etag 将被添加到请求备注中,并要求服务器不生成 ETag。如果服务器忽略了 no-etag 的 value 并且无论如何都会生成 ETag,那么 ETag 将得到尊重。on
现有的 ETag 将得到尊重,服务器生成的 ETag 将在响应中传递。
SSILastModified 指令
描述: | 控制是否由服务器生成Last-Modified headers。 |
句法: | SSILastModified on\|off |
默认: | SSILastModified off |
Context: | 目录,.htaccess |
状态: | Base |
模块: | mod_include |
兼容性: | 可在 version 2.2.15 及更高版本中使用。 |
在正常情况下,由mod_include过滤的文件可能包含动态生成的元素,或者可能独立于原始文件而更改的元素。因此,默认情况下会从响应中删除Last-Modified
标头。
SSILastModified
指令会覆盖此行为,并允许在已存在的情况下遵循Last-Modified
标头,或者如果标头尚未存在则设置。这可用于启用输出的缓存。SSILastModified
可以采用以下值:
off
除非 XBitHack 指令设置为 full,否则 Last-Modified 标头将从响应中删除,如下所述。on
如果已存在于响应中,则将遵循 Last-Modified 标头,如果响应是文件且标头丢失,则会将其添加到响应中。 SSILastModified 指令优先于 XBitHack。
SSILegacyExprParser 指令
描述: | 为条件表达式启用兼容模式。 |
句法: | SSILegacyExprParser on\|off |
默认: | SSILegacyExprParser off |
Context: | 目录,.htaccess |
状态: | Base |
模块: | mod_include |
兼容性: | 可在 version 2.3.13 及更高版本中使用。 |
从 version 2.3.13 开始,mod_include已切换到#if
流控制元素中条件表达式的新ap_expr语法。该指令允许切换到与 Apache HTTPD version 2.2.x 及更早版本兼容的旧语法。
SSIStartTag 指令
描述: | String 启动一个 include 元素 |
句法: | SSIStartTag tag |
默认: | SSIStartTag "<!--#" |
Context: | server config,virtual host |
状态: | Base |
模块: | mod_include |
该指令更改mod_include查找的 string 以将 include 元素标记为 process。
如果有 2 个服务器解析文件的输出,每个服务器处理不同的命令(可能在不同的时间),则可能需要使用此选项。
SSIStartTag "<%" SSIEndTag "%>"
上面给出的 example(也指定了匹配的SSIEndTag)将允许您使用 SSI 指令,如下面的 example 所示:
带有备用开始和结束标记的 SSI 指令
<%printenv %>
参见
- SSIEndTag
SSITimeFormat 指令
描述: | 配置 date strings 显示的格式 |
句法: | SSITimeFormat formatstring |
默认: | SSITimeFormat "%A,%d-%b-%Y %H:%M:%S %Z" |
Context: | server config,virtual host,directory,.htaccess |
覆盖: | 所有 |
状态: | Base |
模块: | mod_include |
此指令更改回显DATE
环境变量时 date strings 显示的格式。 formatstring 与 C 标准 library 中的strftime(3)
相同。
该指令与<!--#config timefmt=formatstring -->
元素具有相同的效果。
SSITimeFormat "%R, %B %d, %Y"
上述指令将导致时间以“22:26,2002 年 6 月 14 日”的格式显示。
SSIUndefinedEcho 指令
描述: | 当回显未设置的变量时显示 String |
句法: | SSIUndefinedEcho string |
默认: | SSIUndefinedEcho "(none)" |
Context: | server config,virtual host,directory,.htaccess |
覆盖: | 所有 |
状态: | Base |
模块: | mod_include |
当没有设置变量并且“回显”时,该指令更改mod_include显示的 string。
SSIUndefinedEcho "<!-- undef -->"
XBitHack 指令
描述: | 在 files 中解析 SSI 指令并设置执行位 |
句法: | XBitHack on\|off\|full |
默认: | XBitHack off |
Context: | server config,virtual host,directory,.htaccess |
覆盖: | 选项 |
状态: | Base |
模块: | mod_include |
XBitHack
指令控制普通 html 文档的解析。该指令仅影响与MIME-typetext/html
关联的 files。XBitHack
可以采用以下值:
off
没有特殊处理可执行文件 files。on
任何设置了 user-execute 位的 text/html 文件都将被视为 server-parsed html 文档。full
至于还要测试 group-execute 位。如果已设置,则将返回文件的 Last-modified date 设置为文件的最后修改 time。如果未设置,则不发送 last-modified date。设置此位允许 clients 和代理缓存请求的结果。注意您不希望使用完整选项,除非您确保为每个 SSI 脚本取消设置 group-execute 位,这可能#include CGI 或者在每次命中时产生不同的输出(或者可能在后续请求中发生更改)。当 SSILastModified 设置为 on 时,SSILastModified 指令优先于 XBitHack 指令。