一、什么是rewrite
rewirte就是实现Url地址重写,以及重定向,就是把传入的web请求重定向到其他URL的过程。
二、rewrite的使用场景
a、url地址的跳转。比如访问www.example.com/test,重定向到test.example.com网址。
b、协议的跳转,主要的就是实现http协议跳转到https页面去。
c、实现网站的伪静态。伪静态就是将网站动态页面的诸多参数,显示为一种静态页面的方式,以便于搜索引擎记录,减少URL地址暴露过多参数,提高安全性。
d、通过上述伪静态,产生较好的URL地址,利于做SEO优化
三、rewrite指令语法
Syntax: rewrite regex replacement [flag];
Default: ---
Context: sever location if
flag标记总共有四种:
last——完成该rewrite规则的执行后,停止处理后续rewrite指令集;然后查找匹配改变后URI的新location;
break——完成该rewrite规则的执行后,停止处理后续rewrite指令集,并不再重新查找;但是当前location内剩余非rewrite语句和location外的的非rewrite语句可以执行;
redirect返回302临时重定向, 地址栏会显示跳转后的地址
permanent返回301永久重定向, 地址栏会显示跳转后的地址
last和break的区别:
server { listen 80;
server_name rewrite.example.com;
root /code;
location ~ ^/break {
rewrite ^/break /test break;
}
location ~ ^/last {
rewrite ^/last /test last;
}
location /test {
default_type text/plain;
return 200 'ok';
}
}
在这个示例配置文件中,当访问rewrite.example.com/break时,当/code/test目录不存在时,报404错误,目录存在时,报403错误。<br/>
而当访问rewrite.example.com/last时,页面会直接返回“OK”字样。
原因呢,在于:
break在匹配到规则后,会去本地目录中去寻找请求的文件。寻找不到,则就会报错。
last在匹配到规则后,则会对其所在的server{...}标签重新发起请求。
那么对于上面的配置文件的理解就是:当/code/test目录下,还存在着index.html文件时,不管index.html文件的内容是什么,因为最后的location都匹配到了/test目录,最终都return回来200的状态码,页面显示的内容都会是“ok”字样(不管是访问rewrite.example.com/break还是rewrite.example.com/last)。只有当不存在"location /test”段的配置时,才会返回index.html页面的内容。
<br/>
对应redirect和permanent,它们的区别是:
redirect每次请求都会询问服务器,如果服务器不可用,则会跳转失败。
permanent则是第一次请求时会询问,浏览器会记录下跳转后的地址,第二次则不再询问服务器,直接通过浏览器缓存的地址访问。除非清理浏览器缓存。
redirect的缺点是会消耗一定的资源。permanent的 缺点是当被跳转的地址再次发生变化时,跳转的访问就不再可用了。
<br/>
以下全局变量,在做if判断时可用引用。
$args<span class="crayon-h" style="margin: 0px; padding: 0px;"> <span class="crayon-c" style="margin: 0px; padding: 0px;">#这个变量等于请求行中的参数,同$query_string;
$content_length<span class="crayon-h" style="margin: 0px; padding: 0px;"> <span class="crayon-c" style="margin: 0px; padding: 0px;">#请求头中的Content-length字段;</span></span></span></div><div id="crayon-5a0a6ace16f1b051007228-3" class="crayon-line" style="margin: 0px; padding: 0px; background-color: rgb(255, 255, 255); color: rgb(73, 73, 73); font-family: Arial, Helvetica, sans-serif; white-space: normal;"><span class="crayon-v" style="margin: 0px; padding: 0px;">$content_type #请求头中的Content-Type字段;
$document_root<span class="crayon-h" style="margin: 0px; padding: 0px;"> <span class="crayon-c" style="margin: 0px; padding: 0px;">#当前请求在root指令中指定的值,如:root /var/www/html;</span></span></span></div><div id="crayon-5a0a6ace16f1b051007228-5" class="crayon-line" style="margin: 0px; padding: 0px; background-color: rgb(255, 255, 255); color: rgb(73, 73, 73); font-family: Arial, Helvetica, sans-serif; white-space: normal;"><span class="crayon-v" style="margin: 0px; padding: 0px;">$host #请求主机头字段,否则为服务器名称;
$http_user_agent<span class="crayon-h" style="margin: 0px; padding: 0px;"> <span class="crayon-c" style="margin: 0px; padding: 0px;">#客户端agent信息;</span></span></span></div><div id="crayon-5a0a6ace16f1b051007228-7" class="crayon-line" style="margin: 0px; padding: 0px; background-color: rgb(255, 255, 255); color: rgb(73, 73, 73); font-family: Arial, Helvetica, sans-serif; white-space: normal;"><span class="crayon-v" style="margin: 0px; padding: 0px;">$http_cookie #客户端cookie信息;
$limit_rate<span class="crayon-h" style="margin: 0px; padding: 0px;"> <span class="crayon-c" style="margin: 0px; padding: 0px;">#这个变量可以限制连接速率;</span></span></span></div><div id="crayon-5a0a6ace16f1b051007228-9" class="crayon-line" style="margin: 0px; padding: 0px; background-color: rgb(255, 255, 255); color: rgb(73, 73, 73); font-family: Arial, Helvetica, sans-serif; white-space: normal;"><span class="crayon-v" style="margin: 0px; padding: 0px;">$request_method #客户端请求的动作,通常为GET或POST;
$remote_addr<span class="crayon-h" style="margin: 0px; padding: 0px;"> <span class="crayon-c" style="margin: 0px; padding: 0px;">#客户端的IP地址;</span></span></span></div><div id="crayon-5a0a6ace16f1b051007228-11" class="crayon-line" style="margin: 0px; padding: 0px; background-color: rgb(255, 255, 255); color: rgb(73, 73, 73); font-family: Arial, Helvetica, sans-serif; white-space: normal;"><span class="crayon-v" style="margin: 0px; padding: 0px;">$remote_port #客户端的端口;
$remote_user<span class="crayon-h" style="margin: 0px; padding: 0px;"> <span class="crayon-c" style="margin: 0px; padding: 0px;">#已经经过Auth Basic Module验证的用户名;</span></span></span></div><div id="crayon-5a0a6ace16f1b051007228-13" class="crayon-line" style="margin: 0px; padding: 0px; background-color: rgb(255, 255, 255); color: rgb(73, 73, 73); font-family: Arial, Helvetica, sans-serif; white-space: normal;"><span class="crayon-v" style="margin: 0px; padding: 0px;">$request_filename #当前请求的文件路径,由root或alias指令与URI请求生成;
$scheme<span class="crayon-h" style="margin: 0px; padding: 0px;"> <span class="crayon-c" style="margin: 0px; padding: 0px;">#HTTP方法(如http,https);</span></span></span></div><div id="crayon-5a0a6ace16f1b051007228-15" class="crayon-line" style="margin: 0px; padding: 0px; background-color: rgb(255, 255, 255); color: rgb(73, 73, 73); font-family: Arial, Helvetica, sans-serif; white-space: normal;"><span class="crayon-v" style="margin: 0px; padding: 0px;">$server_protocol #请求使用的协议,通常是HTTP/1.0或HTTP/1.1;
$server_addr<span class="crayon-h" style="margin: 0px; padding: 0px;"> <span class="crayon-c" style="margin: 0px; padding: 0px;">#服务器地址,在完成一次系统调用后可以确定这个值;</span></span></span></div><div id="crayon-5a0a6ace16f1b051007228-17" class="crayon-line" style="margin: 0px; padding: 0px; background-color: rgb(255, 255, 255); color: rgb(73, 73, 73); font-family: Arial, Helvetica, sans-serif; white-space: normal;"><span class="crayon-v" style="margin: 0px; padding: 0px;">$server_name #服务器名称;
$server_port<span class="crayon-h" style="margin: 0px; padding: 0px;"> <span class="crayon-c" style="margin: 0px; padding: 0px;">#请求到达服务器的端口号;</span></span></span></div><div id="crayon-5a0a6ace16f1b051007228-19" class="crayon-line" style="margin: 0px; padding: 0px; background-color: rgb(255, 255, 255); color: rgb(73, 73, 73); font-family: Arial, Helvetica, sans-serif; white-space: normal;"><span class="crayon-v" style="margin: 0px; padding: 0px;">$request_uri #包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”;
$uri<span class="crayon-h" style="margin: 0px; padding: 0px;"> <span class="crayon-c" style="margin: 0px; padding: 0px;">#不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”;
$document_uri<span class="crayon-h" style="margin: 0px; padding: 0px;"> <span class="crayon-c" style="margin: 0px; padding: 0px;">#与$uri相同,例:http://localhost:88/test1/test2/test.php; <br/>
关于rewrite指令,https://www.cnblogs.com/guantou1992/p/12777138.html 这篇文章讲的比较详细全面。