nginx中try_files參數易被忽略的知識點
mkdir -p /php/aaa/bbb
vim /php/aaa/index.html
<h1>small try</h1>
配置nginx server
server { listen 80; server_name www.ready.org; location / { root /php; try_files $uri $uri/ /index.php; index index.html index.htm; } location ~ .*\.(php|php5)?$ { root /php; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; } }
如上面的簡單例子,開啟了try_files參數時,瀏覽器輸入www.ready.org/aaa 或者 www.ready.org/aaa/ 都會顯示small try:
若瀏覽器輸入www.ready.org/aaa/bbb 則會出現403 Forbidden
若瀏覽器輸入www.ready.org/ccc 時,則會跳轉至phpinfo頁面(默認在根下創建了名為index.php的phpinfo文件)
由上述可以看出try_files參數可以實現自動檢測網站根下是否存在用戶在瀏覽器輸入的名為URI文件和名為URI的目錄,若存在則會跳轉至用戶請求的URI,並按所匹配的location完成後續步驟,若不存在則會跳轉至最後一個參數,這以上例子中最後一個參數是根下的index.php(phpinfo),所以當找不到ccc目錄和文件時,便跳轉至根下的index.php
但會有一個比較特殊的情況,先看下面的例子:
server { listen 80; server_name www.ready.org; location / { root /php; **try_files $uri $uri/ =502** index index.html index.htm; } location ~ .*\.(php|php5)?$ { root /php; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; } }
粗體部分是修改後的參數,簡單的說就是當nginx找不到用戶請求的URI文件和目錄時,會直接跳轉到502錯誤頁面,有了之前的例子這個就很好理解。但如果改成以下情況:
server {
listen 80;
server_name www.ready.org;
location / {
root /php;
**try_files $uri $uri/ /index.php =502;**
index index.html index.htm;
}
location ~ .*\.(php|php5)?$ {
root /php;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
}
當用戶請求為www.ready.org/ccc 時會出現什麽情況呢?
測試後發現會彈出php文件的下載對話框(因為瀏覽器不同,有些瀏覽器會直接顯示php文件的源碼),不管怎麽這都說明php文件沒有被解析直接返回給了用戶,為什麽呢?原來是因為try_files參數會一直判斷後面的文件或目錄是否存在,若不存在會一直向後檢查,直到倒數第二個參數被檢查完,若都不存在,即解析並返回最後一個參數,中途的檢查若存在,則直接返回給用戶而不做解析,所以上面的例子最後才會返回php源碼,nginx會自己內部直接返回,而不會交由php-fpm解析再返回。
nginx中try_files參數易被忽略的知識點