0%

Nginx的Location,Rewrite URL配置

##Nginx配置说明

Nginx是目前非常流行的Web server。它可以高效的处理多并发网络请求,可以比较简便的配置成Web server或者mail server,又或者可以作为反向代理服务器来使用。Nginx除了高性能,功能全,还有配置灵活的特性,通过配置可以实现很多复杂的功能,尤其是Server, Location,Rewrite的配置。

Server Block 配置

"virtual host"是Apache的术语,现在Apache已经年老色衰了,基本上都是在使用Nginx作为web server。在Nginx中,类似的概念叫Server Block. 通过配置一个Server,就可以支持一个域名,设置对应的目录就可以当做一个新的网站。配置上多个Server,就可以在同一台机器上配置多个域名,这样比较节省云主机资源。基本的语法如下:

1
2
3
4
5
server {
listen 80;
server_name example.org www.example.org;
...
}

其中server_name配置项就是此战域名的配置,可以直接写,也可以通过*通配符,还支持正则表达式,具体可以参考官网这篇文章。Nginx的每项指令要有分号最为结尾,如果没有的话则不生效,这会导致很多莫名其妙的错误,比如跳转到本机上其他网站。

nginx Server Block的配置中,还可以写入listen, index, access_log 等指令,比较重要的是Location指令的规则。

Location指令规则

通过Server Block的配置,nginx可以确定一个请求对应哪个域名,再通过Location的配置,确定使用哪个具体的文件来相应URI的请求。Location可以根据不同请求设置不同配置,比如对于静态图片设置缓存时间,对于.php脚本设置fastcgi的端口,对于特殊的URL进行重定向或者重写。

Location的语法规则如下:

1
2
3
4
5
location <font color='red'>[ = | ~ | ~* | ^~ ]</font>   uri {

. . .

}

修饰符是可选的,他的规则如下:

  1. =:等号表示完全匹配
  2. ~:破折号表示大小写敏感的正则匹配
  3. ~*:表示大小写不敏感的正则匹配
  4. ^~:表示前缀匹配,但是优先级高于正则匹配
  5. <无>: 没有修饰符,表示为按location_match前缀匹配。

多个 location 配置的情况下匹配顺序为(未验证,仅供参考):

  • 首先精确匹配 =
  • 其次前缀匹配 ^~
  • 其次是按文件中顺序的正则匹配
  • 然后匹配不带任何修饰的前缀匹配。
  • 最后是交给 / 通用匹配
  • 当有匹配成功时候,停止匹配,按当前匹配规则处理请求

Rewrite配置

当需要对URL进行重写的时候,就要rewrite了。就像当初困惑我很久的问题:PHP做后台的程序,为什么在URL上看不到.php后缀,也看不到?xx=xxx的参数,原来是都写入URL上了。这些在Nginx都是通过Rewrite来实现的。

Rewrite指令可以放到Server、Location或者if的配置块中去,能够实现比较复杂的逻辑。基本语法如下:

1
rewrite regex URL [flag];

官网的这篇文章写的不错,值得看一下,它比较了try_files、return和rewrite三个命令的区别。