1. 程式人生 > >nginx中try_files參數易被忽略的知識點

nginx中try_files參數易被忽略的知識點

簡單例子 orb 文件和目錄 bee con fastcgi 會有 倒數 才會

先創建測試目錄與文件

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參數易被忽略的知識點