首页 > 软件服务 > WEB软件 > 关于NGINX的SSI的STUB和一些使用问题上的理解

关于NGINX的SSI的STUB和一些使用问题上的理解

WEB软件

一、问题情况

遇到一个需要使用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里看到:

这时候需要在页面上先定义一次file_not_found块,stub的作用为如果请求为空或返回一个错误后使用的默认块。

<!--# block name="file_not_found" -->#你想请求为空或返回错误时显示的内容#<!--# endblock -->如果你想引入内容为空或错误比如50x和40x的时候显示为空就:

再去

就可以正常工作了.