新手用nginx,有几个问题问下大神们
问题描述
此前看到慕课网是用nginx部署的静态资源,所以想自己尝试下用ngjinx部署我的资源。现在需要下面几个问题:
比如慕课网的这个链接:http://www.imooc.com/course/list ,它是怎么匹配url后的/course/list,我只能使用list.html,我想让每个连接都不会出现.html的后缀,这个是重写url吗,还是用location配置2.
上面的是一个location的配置,用来反向代理,它不应该可以匹配像/test/test.html,但是没有匹配到,所以没有转发到代理服务器,而是正常显示静态页面。
但是它可以匹配这样的:/products/getproducts/2,确实转发到了:localhost:8086/products/getproducts/2 ,得到正确的数据。
先问这两个吧,对服务器不是很懂,可能有点白痴,望解答呀
问题解答
回答1:第一个问题:Nginx用try_files指令可以很方便地把请求数据导入到框架的前端控制器比如index.php里:
location { try_files $uri $uri/ /index.php?$args;}
前端控制器index.php可以用$_SERVER[’REQUEST_URI’]获取/course/list这串URL参数,如果后面还有参数,比如/course/list?page=2&tag=mysql,这时可以用$_SERVER[’QUERY_STRING’]获取查询串page=2&tag=mysql,然后自行urldecode后用explode以&分割串获得类似$_GET的参数数组,也可以直接使用$_GET拿到参数数组.
总而言之,就是由程序入口index.php及其里面的程序决定是加载HTML静态文件返回,还是连接数据库可进行处理.如果你想让Nginx判断是否命中HTML缓存,可以这样配置:
location / { try_files $uri $uri/ /html$uri.html /index.php?$args;}
比如访问/post/1024,Nginx会按try_files给定的顺序尝试访问以下文件:/post/1024 ($uri 表示文件)/post/1024/ ($uri/ 表示目录)/html/post/1024.html (/html$uri.html 表示你的HTML静态缓存)如果都不存在,则连同参数把URI信息交给index.php处理 (最后的/index.php?$args表达的就是这个意思).
回答2:问题 1,可以使用rewrite方式,例如:
rewrite '^/(course/.*)/?' $1.html last;
需要注意的是只重写所有course 开头的请求xxx.com/course/list -> xxx.com/course/list.htmlxxx.com/course/list/sub -> xxx.com/course/list/sub.html
问题 2感觉应该还有其他的location 配置,如果方便把整个nginx配置贴出来