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; }
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; #图片服务器可以获取图片 } }