一、问题情况
遇到一个需要使用ssi加载公共页面的地方,但是同时又需要动态判断user-agent或者IP等信息。以前ssi都是加载静态页。所以就动手研究了一下。
二、使用说明
NGINX的SSI开启方法:
ssi的配置参数如下:
ssi on; 开启ssi支持
ssi_silent_errors on; 默认为off,设置为on则在处理SSI文件出错时不 输出错误信息
ssi_types text/html;默认为 ssi_types text/html,如果需要支持shtml(服务器执行脚本,类似于jsp)则需 要设置为ssi_types text/shtml
作用域 location | server | location | location 的 if 中
ssi [on | off];
ssi_silent_errors [on | off];
#如果在处理SSI的过程中出现“[an error occurred while processing the directive]”错误,禁止将其输出。
ssi_types mime-type [mime-type ...]
#解析 ssi 的类型
ssi_value_length length
#默认256 允许SSI使用的参数值的长度
详细的可以看:https://blog.csdn.net/Lindong_Jen/article/details/107861405
经过测试发现ssi类似一个完整的proxy请求,不管是用户的IP还是user-agent都可以传递到你写的ssi加载地址上去.而且这里有一点<!--#include virtual="/index.html"-->加载的虚拟地址,相当于直接nginx配置里本地解析,不会经过DNS的解析,比如说网站页面上了CDN,如果用proxy直接写域名转发,会经过DNS解析,然后通过CDN走回来,但是ssi直接用当前nginx的配置解析,请求到对应的路径去,不经过外部请求.include virtual加载的地址,不管在nginx里再次经过proxy或者是rewrite,都可以正常的转发.
然后还有遇到一点,如果加载的地址404.会出现整个404页面被引入到当前页,这时候可以写stub="file_not_found",但是这个stub是需要用户自己定义的才可以,如果直接写的话,会造成ssi请求失败,而且没有任何的输出,哪怕开启了ssi_silent_errors on也不会有输出;在nignx的error_log里看到:
1 |
xxxx/xx/xx xx:xx:xx [error] xxxx#xxxx: *1 "stub"="file_not_found" for "include" not found while sending response to client, client: 127.0.0.1, server: localhost, request: "GET / HTTP/1.1", host: "localhost" |
这时候需要在页面上先定义一次file_not_found块,stub的作用为如果请求为空或返回一个错误后使用的默认块。
<!--# block name="file_not_found" -->#你想请求为空或返回错误时显示的内容#<!--# endblock -->如果你想引入内容为空或错误比如50x和40x的时候显示为空就:
1 |
<!--# block name="file_not_found" --><!--# endblock --> |
再去
1 |
<!--# include virtual="/index.html" stub="file_not_found" --> |
就可以正常工作了.