- rewrite结尾标识符
1)last :就相当于Apache里的(L)标记,表示完成rewrite匹配
2)break:完成本条规则匹配后,终止匹配,不会再匹配后面的规则
3)redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址
4)permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
其中last和break用来实现URL重写时,浏览器地址栏URL地址不变
- rewrite常用表达式
. 匹配任何单字符
? 匹配0到1个字符
* 匹配0到多个字符
+ 匹配1到多个字符
^ 字符串开始标志
$ 字符串结束标志
\n 转义符标志
[string] 匹配字符串:string
[^string] 不匹配字符串:string
hello|world 可选择的字符串:hello|world
- rewrite常用变量
REMOTE_ADDR 客户端的IP地址
HTTP_USER_AGENT 用户使用的代理,例如浏览器
REQUEST_FILENAME 访问的文件和目录
HTTP_REFERER 告知服务器,从哪个页面来访问的
HTTP_COOKIE 客户端缓存,主要用于存储用户名和密码等信息
HTTP_HOST 服务器域名
HTTP_ACCEPT 客户端的浏览器支持的MIME类型
DOCUMENT_ROOT 服务器发布目录
SERVER_PORT 服务器端口
SERVER_PROTOCOL 服务器端协议
QUERY_STRING URL中访问的字符串
TIME_YEAR 年
TIME_MON 月
TIME_DAY 日
- rewrite常用案例
1)去掉域名后面的forum.php
rewrite /forum.php http://www.lee1.com/ permanent;
rewrite ^/$ /forum.php last;
2)判断是否IE浏览器,是的话重写到百度页面,ZF有时候用这个来判断,如果不用ie就直接返回个错误页面并提示要用ie
if ( $http_user_agent ~ MSIE )
{
rewrite ^(.*)$ http://www.baidu.com/ permanent;
}
3)判断是否用手机等来登录的,是的话重写到其他页面
if ( $http_user_agent ~* "(Android)|(iPhone)|(Mobile)|(WAP)|(UCWEB)" )
{
rewrite ^/$ http://www.baidu.com/ permanent;
}
4)args指匹配url里任意字符的意思
if ($args ~* tid=2017)
{
return 500;
}
在浏览器输入http://www.123.com/hahah/ddd?tid=2017,就会提示500 Internal Server Error ,而2017改成其他数字,则直接提示不存在页面,即not found
5)带着参数,实现伪静态,用户可以访问html,但是页面实际上是动态的php等,也就是php转成html的
rewrite ^/([0-9]+)/lee/(.+)$ /phpinfo.php?tid/$1/items=$2 permanent;
比如说很难写下面的:
http://bbs.lee.com/forum.php?gid=68
相对来说,http://bbs.lee.com/thread-2221-1-1.html则比较美观。
语句为
rewrite ^/thread-([0-9]+)-1.html /forum.php?gid=$1 last;
$1就是代表前面括号里的[0-9]+,毕竟静态页面比较友好
6)访问的/直接指向phpinfo.php页面
rewrite ^/$ /phpinfo.php break;
把phpinfo.php文件重定向为www.123.com,网址也会改,permanent是强制改变网址
rewrite ^/phpinfo.php http://www.123.com/ permanent;
访问这个页面的时候重定向到back.jpg
rewrite ^/linux/2019/$ /back.jpg last;
这里要注意如果是下面加了动静分离的语句,则会提示not found,因为已把.jpg格式给了下面的语句来处理
location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
7)如果不存在访问的页面,则重定向到phpinfo.php页面,一般网站停止运行的时候会用到这个,就是为了防止404
if ( !-e $request_filename)
{
rewrite ^/(.*)$ /phpinfo.php last;
}
这个重写语句的功能跟error_page 500 502 503 504 /50x.html;类似,都是错误时候的指向页面,所以两者可选其一。而50x.html则是在/usr/local/nginx/html/50x.html