nginx是一款神器的web服务软件,它的配置文件提供了强大的编程空间,你可以借助于Nginx正则表达式之匹配操作符对服务器的重定向、伪静态、防盗链等进行详细的配置。怎么配置Nginx的重定向呢?万维景盛工程师为您分享方法:
nginx可以在配置文件中对某些内置变量进行判断,从而实现某些功能。
比如:防止重写rewrite、盗链、对静态资源设置缓存以及浏览器限制等等。
值得注意的是,nginx配置中有if指令,但是没有对应else指令,所以判断要分为匹配和不匹配两种情况进行分别处理。
字符串表达式支持正则表达式,能设定大小写是否敏感。因此共有四个操作符,
如下:
~ 区分大小写(大小写敏感)匹配成功
~* 不区分大小写匹配成功
!~ 区分大小写匹配失败
!~* 不区分大小写匹配失败
1: 通过if指令限制某些类型的客户端的访问
所有的Nginx内置变量都可以通过if指令和正则表达式来进行匹配,并且根据匹配结果进行一些操
代码如下 |
location / { |
#限制IE访问
如果把MSIE改成 Mozilla 就基本上把IE和firefox这样pc浏览器限制了
2和3主要是针对盗链做处理
2:针对不同的文件类型
可能这个指令是我们平时使用正则匹配用的最多的指令:
代码如下 |
location ~ .*.(wma|wmv|asf|mp3|mmf|zip|rar|jpg|gif|png|swf|flv)$ { |
3:针对不同的目录
代码如下 |
location /img/ { |
^~操作符。
^~标识符后面跟一个字符串。Nginx将在这个字符串匹配后停止进行正则表达式的匹配(location指令中正则表达式的匹配的结果优先使用),如:location ^~ /images/,你希望对/images/这个目录进行一些特别的操作,如增加expires头,防盗链等,但是你又想把除了这个目录的图片外的所有图片只进行增加expires头的操作,这个操作可能会用到另外一个location,例如:location ~* .(gif|jpg|jpeg)$,这样,如果有请求/images/1.jpg,nginx如何决定去进行哪个location中的操作呢?结果取决于标识符^~,如果你这样写:location /images/,这样nginx会将1.jpg匹配到location ~* .(gif|jpg|jpeg)$这个location中,这并不是你需要的结果,而增加了^~这个标识符后,它在匹配了/images/这个字符串后就停止搜索其它带正则的location。
2.=操作符。
等于符号=表示精确的查找地址,如location = /它只会匹配uri为/的请求,如果请求为/index.html,将查找另外的location,而不会匹配这个,当然可以写两个location,location = /和location /,这样/index.html将匹配到后者,如果你的站点对/的请求量较大,可以使用这个方法来加快请求的响应速度。
3.@操作符。
@表示为一个location进行命名,即自定义一个location,这个location不能被外界所访问,只能用于Nginx产生的子请求,主要为error_page和try_files。
注意,这3个标识符后面不能跟正则表达式,虽然配置文件检查会通过,而且没有任何警告,但是他们并不会进行匹配。
综上所述,location指令对于后面值的匹配顺序为:
1.标识符“=”的location会最先进行匹配,如果请求uri匹配这个location,将对请求使用这个location的配置。
2.进行字符串匹配,如果匹配到的location有^~这个标识符,匹配停止返回这个location的配置。
3.按照配置文件中定义的顺序进行正则表达式匹配。最早匹配的location将返回里面的配置。
4.如果正则表达式能够匹配到请求的uri,将使用这个正则对应的location,如果没有,则使用第二条匹配的结果。
这里再举个应用的例子,也就是旧站迁移后进行便利的重定向。
#将原来的php文件都转向到新域名。位置必须在伪静态之前,否则无法检测到php文件 location ~ .*\.(php)?$ { return 301 https://www.verysign.cn$request_uri; }
这样,就可以将站点中的所有php文件都重定向到一个新的域名了。