需求,将http://localhost:80/index/abc rewrite为http://localhost:80/abc.php/abc
访问网站时只输入http://localhost:80/index/abc
经过nginx rewrite后,
重定访问路径为:http://localhost:80/abc.php/abc
rewrite指令的功能就是,使用nginx提供的全局变量或自己设置的变量,然后结合正则表达式和标志位实现url重写以及重定向。rewrite指令只能放在server、location或if中,并且只能对域名后边的除去传递的参数外的字符串起作用,例如 http://ywnds.com/a/we/index.php?id=1&u=str,只对/a/we/index.php重写。
如果想对域名或参数字符串起作用,可以使用全局变量匹配,也可以使用proxy_pass反向代理。
nginx代码如下:
location /{
if(!-e $request_filename){
#1
rewrite ^/index/(.*)$ /abc.php?s=/$1 last;
#2
rewrite ^/abc.php(.*)$ /abc.php?s=/$1 last;
#3
rewrite ^(.*) /abc.php?s=/$1 last;
break;
}
}
-e
1. 当表达式只是一个变量时,如果值为空或任何以0开头的字符串都会当做false;
2. 使用“=”和“!=”比较一个变量和字符串;
3. 使用“~”做正则表达式匹配,“~*”做不区分大小写的正则匹配,“!~”做区分大小写的正则不匹配;
4. 使用“-f”和“!-f” 检查一个文件是否存在;
5. 使用“-d”和“!-d”检查一个目录是否存在;
6. 使用“-e”和“!-e”检查一个文件、目录、符号链接是否存在;
7. 使用“-x”和“ !-x”检查一个文件是否可执行;
$request_filename
$args #这个变量等于请求行中的参数,同$query_string;
$content_length #请求头中的Content-length字段;
$content_type #请求头中的Content-Type字段;
$document_root #当前请求在root指令中指定的值,如:root /var/www/html;
$host #请求主机头字段,否则为服务器名称;
$http_user_agent #客户端agent信息;
$http_cookie #客户端cookie信息;
$limit_rate #这个变量可以限制连接速率;
$request_method #客户端请求的动作,通常为GET或POST;
$remote_addr #客户端的IP地址;
$remote_port #客户端的端口;
$remote_user #已经经过Auth Basic Module验证的用户名;
$request_filename #当前请求的文件路径,由root或alias指令与URI请求生成;
$scheme #HTTP方法(如http,https);
$server_protocol #请求使用的协议,通常是HTTP/1.0或HTTP/1.1;
$server_addr #服务器地址,在完成一次系统调用后可以确定这个值;
$server_name #服务器名称;
$server_port #请求到达服务器的端口号;
$request_uri #包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”;
$uri #不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”;
$document_uri #与$uri相同,例:http://localhost:88/test1/test2/test.php;
rewrite
重写规则组成部分
如图所示包括3部分。每一部分这间用空格分开。
第一部分:任何重写规则的第一部分都是一个正则表达式
正则表达式可以使用括号来捕获,后续可以根据位置来将其引用,位置变量值取决于捕获正则表达式中的顺序,$1引用第一个括号中的值,$2引用第二个括号中的值,以此类推。如:
^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$
$1是两个小写字母组成的字符串,$2是由小写字母和0到9的数字组成的5个字符的字符串,$3将是个文件名,$4是png、jpg、gif中的其中一个。
第二部分:重写规则的第二部分是URI
当重写规则第一部分被匹配到了之后,则请求被改写,那么该URI可能包含正则表达式中的捕获的位置参数或这个级别下的nginx任何配置变量。如:
/data?file=$3.$4
如果这个URI不匹配nginx配置的任何location,那么将给客户端返回301(永久重定向)或302(临时重定向)的状态码来表示重定向类型。该状态码可以通过第三个参数来明确指定。
第三部分:重写规则的第三部分就是标记(flag)
第三部分也就是尾部的标记(flag), last标记将导致重写后的URI搜索匹配nginx的其他location,最多可循环10次。如:
rewrite '^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$' /data?file=$3.$4 last;
在rewrite中,如果使用小括号(),那么在小括号之间匹配的内容,可以在后面通过$1来引用,$2表示的是前面第二个()里的内容,后面会说到。
第3行
将所有不带abc.php的网址,都在开头加上abc.php.其中(.*)表示匹配到的所有的字符,第二部分的/abc.php?s=/$1表示将以此网址进行访问,即在(.*)匹配到的字符前面加上abc.php?s=/
带#的不再加abc.php
rewrite ^/#/(.*)& /#/$1 last;
发送captcha
rewrite ^/captcha /abc.php/captcha.* last;
thinkphp app目录下index 的world function
rewrite ^/tp/(.*)$ /tp/pub/index.php?s=/$1 last;