index指令的作用
在前后端分离的基础上,通过Nginx配置,指定网站初始页。
如果包括多个文件,Nginx会根据文件的枚举顺序来检查,直到查找的文件存在;
文件可以是相对路径也可以是绝对路径,绝对路径需要放在最后;
文件可以使用变量$来命名;
index index.$geo.html index.0.html /index.html;
该指令拥有默认值,index index.html ,即,如果没有给出index,默认初始页为index.html
核心内容(中文文档没有或一笔带过,而官方文档作详细解释):
Nginx给了三种方式来选择初始页,三种方式按照顺序来执行:
ngx_http_random_index_module 模块,从给定的目录中随机选择一个文件作为初始页,而且这个动作发生在 ngx_http_index_module 之前,注意:这个模块默认情况下没有被安装,需要在安装时提供配置参数 --with-http_random_index_module;
ngx_http_index_module 模块,根据index指令规则来选择初始页;
ngx_http_autoindex_module 模块,可以使用指定方式,根据给定目录中的文件列表自动生成初始页,这个动作发生在 ngx_http_index_module之后,即只有通过index指令无法确认初始页,此时启用后的自动生成模块才会被使用。
切记,index指令并不是查到文件之后,就直接拿来用了。它的实际工作方式是:
如果文件存在,则使用文件作为路径,发起内部重定向。直观上看上去就像再一次从客户端发起请求,Nginx再一次搜索location一样。
既然是内部重定向,域名+端口不发生变化,所以只会在同一个server下搜索。
同样,如果内部重定向发生在proxy_pass反向代理后,那么重定向只会发生在代理配置中的同一个server。
实例
server {
listen 80;
server_name example.org www.example.org;
location / {
root /data/www;
index index.html index.php;
}
location ~ \.php$ {
root /data/www/test;
}
}
上面的例子中,如果你使用example.org或www.example.org直接发起请求,那么首先会访问到“/”的location,结合root与index指令,会先判断/data/www/index.html是否存在,如果不,则接着查看
/data/www/index.php ,如果存在,则使用/index.php发起内部重定向,就像从客户端再一次发起请求一样,Nginx会再一次搜索location,毫无疑问匹配到第二个~ \.php$,从而访问到/data/www/test/index.php。
location / {
try_files $uri $uri/ /index.php;
}
当用户请求 http://localhost/example
时,这里的 $uri
就是 /example
。
try_files 会到硬盘里尝试找这个文件。如果存在名为 /$root/example
(其中 $root
是项目代码安装目录)的文件,就直接把这个文件的内容发送给用户。
显然,目录中没有叫 example 的文件。然后就看 $uri/
,增加了一个 /
,也就是看有没有名为 /$root/example/
的目录。
又找不到,就会 fall back 到 try_files 的最后一个选项 /index.php,发起一个内部 “子请求”,也就是相当于 nginx 发起一个 HTTP 请求到 http://localhost/index.php
。