一.簡介
try_file用於偽靜態。
正常的靜態文件是一個xx.html文件,他是真實存在於服務器某個文件夾中的。動態網頁是從數據庫里查詢,返回給瀏覽器的,實際上並沒有這個文件,另外路徑也很長。
偽靜態優點:
縮短URL路徑,更美觀
URL路徑短,容易被SEO收錄,搜索排名靠前
隱藏了真實的訪問路徑,更安全
偽靜態缺點:
與原生的url比較在性能上,不如原生的url,簡單的說偽靜態就是在服務器上又進行了一層url解析,消耗服務器資源。當然了這點消耗與優點相比,我們還是可以接受的。
下面是博客園中的一篇博客,地址是xx.html,讓人看起來是一個html文件
這個是微信的一個文章的地址,后面的參數是文章在數據庫中的位置,還有一些其它信息
二.配置
server {
listen 80;
server_name xxx.baidu.com;
index index.html index.php;
root /data/html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
}
}
try_files $uri $uri/ /index.php?$query_string
當訪問http://www.baidu.com/3434.html 時,$uri就是3434.html,它會去本地的/data/html下面找3434.html。
如果沒找到3434.html,就匹配$uri/,nginx會去/data/html找有沒有這個目錄。
如果還找不到就會匹配最后一個選項,/index.php?$query_string。發起一個內部 “子請求”,也就是相當於 nginx 發起一個 HTTP 請求http://www.baidu.com/3434.php 這個請求會被后面的location ~ .php$ 來匹配,當php程序解析完后,再返回給瀏覽器。
而具體的 URI 及參數是在 REQUEST_URI 中傳遞給 FastCGI 和 PHP 程序的,因此不受 URI 變化的影響。
三.整體流程
你在百度搜索一篇文章,右鍵復制鏈接地址,粘貼到筆記上,會發現鏈接非常的長。
https://www.baidu.com/link.php?wd=&eqid=e307e4f6000029fa000000035b864c15
當點擊后,這篇文章所在的服務器,會try_files $uri $uri/ /index.php?$query_string;
,首先匹配是否是xx.html,明顯不是,但也不是文件夾,那就交給fastcgi,轉而交給php-fpn去操作。
php看到里面寫的是去數據庫查詢一個id號為e307e4f6000029fa000000035b864c15的文章,就將文章提取后發給瀏覽器,並取名叫3434.html,這個只是顯示,並不存在。
四.更多
交給反向代理
如果后端不是php而是反向代理則:
location / {
#直接匹配最后面的,不去尋找了
try_files /_not_exists_ @backend;
}
location @backend {
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
#后端程序地址
proxy_pass http://127.0.0.1:8181;
}
A機器沒有的圖片從B機器獲得
server {
#訪問圖片文件,這里做解析
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {
root /img; #指定圖片所在目錄
try_files $uri $uri/ @backend; #當圖片不存在,會嘗試交給@backend來獲取圖片
}
location @backend { #反向代理給圖片服務器
proxy_pass http://192.168.2.166; #圖片服務器可以獲取圖片
}
}