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
。