php,nginx配置重定向,rewrite

需求,将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;
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值