Nginx Rewrite详解

这篇文章是我接触 nginx 还没多久的时候看过的,当时某篇文章就参考了这一篇,原文是http://blog.cafeneko.info/2010/10/nginx_rewrite_note/(链接崩坏,不用点了),一年多过去了自己的水平离作者还是差得远,这个网站的站长是我当时就很佩服的一个聚聚,不过近期偶然发现源站已经挂掉,这么好的文章就此消失实在是很遗憾的事情,于是决定扒出来放在自己博客里留做纪念。


在新主机的迁移过程中,最大的困难就是WP permalink rewrite的设置.

因为旧主机是用的Apache, 使用的是WP本身就可以更改的.htaccess,没有太大的难度.而这次在VPS上跑的是Nginx,主要是因为Nginx的速度比Apache要快很多.

但是另一方面就不是那么舒服了,因为Nginx的rewrite跟Apache不同,而且是在服务器上面才能更改.

下面是其间的一些研究笔记.(以下用例如无特别说明均摘自nginx wiki)

 

/1 Nginx rewrite基本语法

 

Nginx的rewrite语法其实很简单.用到的指令无非是这几个

  • set
  • if
  • return
  • break
  • rewrite

麻雀虽小,可御可萝五脏俱全.只是简单的几个指令却可以做出绝对不输apache的简单灵活的配置.

1.set

set主要是用来设置变量用的,没什么特别的

2.if

if主要用来判断一些在rewrite语句中无法直接匹配的条件,比如检测文件存在与否,http header,cookie等,

用法: if(条件) {…}

– 当if表达式中的条件为true,则执行if块中的语句

– 当表达式只是一个变量时,如果值为空或者任何以0开头的字符串都会当作false

– 直接比较内容时,使用 = 和 !=

– 使用正则表达式匹配时,使用

~ 大小写敏感匹配
~* 大小写不敏感匹配
!~ 大小写敏感不匹配
!~* 大小写不敏感不匹配

这几句话看起来有点绕,总之记住: ~为正则匹配, 后置*为大小写不敏感, 前置!为”非”操作

随便一提,因为nginx使用花括号{}判断区块,所以当正则中包含花括号时,则必须用双引号将正则包起来.对下面讲到的rewrite语句中的正则亦是如此.
比如 “\d{4}\d{2}\.+”

– 使用-f,-d,-e,-x检测文件和目录

-f 检测文件存在
-d 检测目录存在
-e 检测文件,目录或者符号链接存在
-x 检测文件可执行

跟~类似,前置!则为”非”操作

举例

//如果UA包含”MSIE”,rewrite 请求到/msie目录下

//如果cookie匹配正则,设置变量$id等于正则引用部分

//如果提交方法为POST,则返回状态405 (Method not allowed)

//如果请求文件名不存在,则反向代理localhost