09-nginx Rewrite语法详解
和location类似,也是要负责URL解析的。
rewrite 重写
nginx的配置非常多,nginx的第三方模块也非常非常多。不可能讲每一种模块的配置办法。通常碰到一个nginx的新问题你想怎么去解决?所有模块的信息都在官方文档上。刚才使过nginx的location模块。
看/usr/local/nginx/conf/nginx.conf下面有多个server,每一个server下面又有多个location。既然说上下文是server和location,就意味着你可以把重写的规则放在location里面,也可以放在server里面。所以说你以后碰到一个新模块要安装了说那个新的功能要在nginx中启用了,你不会不要紧,所有模块的说明都在官方网站上,你看它上下文在哪里写,应该在哪个上下文中写,应该是什么语法就ok了。
URL重写的基本语法:和apache差别不大,其实都是使正则表达式。主要还是正则表达式的应用。
现在chrome+火狐已经占了很多份额,占了大概是50%多的份额,IE占少数。再往十年前,IE绝对主流。再往20年前,netscape占主流。netscape就是Mozilla的内核。那个时候netscape占主流,好多服务器都认识它的头信息,就是那个agent信息,知道它的agent信息是Mozilla。后面微软想推出它的浏览器但是市面上都认识Mozilla这个头信息。所以它也只好加了这个头信息:Mozilla 5.0。后面微软一统天下,它一加这个Mozilla 5.0后来大家也就加这个头信息。当然它们自己内部的内核是什么你得看这儿。像刚才的chrome那就是Chrome/51.0.2704,像刚才的IE11最新的那就是Trident/7.0。你打开几乎所有的浏览器前面都加上Mozilla。就是因为9几年网景公司占绝对主力留下了一个历史痕迹。
先测试等号,IP比较适合用等号测试。怎么获取客户端的IP?既然日志有,肯定可以获取它。conf/nginx.conf的remote_addr记录的是远程地址(客户端的IP)。做判断不让自己的IP访问,把自己关在外面。
再测试一个正则表达式的用法。用正则表达式判断它是不是IE用户,你判断它的user-agent头信息里面有没有rv这几个字。对http协议user-agent还不太了解,可以看老师的自学it网公益PHP培训公益http协议那一章,对http协议做了详细的讲解。只要你是IE,我不让你访问任何的页面,
为什么报505错误?其实是已经成功了。
用chrome浏览器访问成功说明我们服务器跑的是正常的。
对喔,这是循环重定向。
如果不想循环重定向那就break。
当你访问的目录或者页面不存在的时候,我就来一个404给你。专门设置一个错误的404页面,这里专门不用系统自带的404功能:error_page。用rewrite来实现。
当前请求的脚本,当前请求的是哪一个文件
哪一个变量体现了请求的这个文件呢?在conf/nginx.conf中没有,在conf/fastcgi.conf中有。
nginx有权引用的所有变量都存放在conf/fastcgi.conf。想起了PHP下的$server变量,其实那些变量都是apache或者是nginx传给它的。nginx首先初始化这些变量。
判断,如果不存在想要请求的文件,就重写到html/404.html。
咱们的PHP还没有装,也读不出这些参数变量准确的值是多少,因此无法判断路径对不对,文件存不存在写,导致调试的时候盲人摸虾。
换一种判断方式。
说明也重写过来了。
查看错误日志,循环重定向到/404.html错误。
再次修改:
再次修改:
心里面还是不舒服,已经重写到404.html上去了,为什么还让我break。404.html是存在的。和全路径无关,404.html无需写全路径。
rewrite重新去读404.html的内容,它的上下文没变。
至此把if的各个条件给测试了,return也测试了,break也测试了,还有一个简单的rewrite。接下来看set。set是设置变量用的。
判断是ie浏览器发起访问请求的,就重写到ie.html上去,但是你不得不加上一个break。加上break是为了防止循环重定向。现在就使用set的功能。这样写的意义不大,用一个break多省事,仅仅是为了让大家练习if和set变量。
装一个ecshop来做rewrite实战。
首先看看本地机有没有装mysql
装PHP 装mysql练习URL重写。