nginx rewrite 详解

重写 URL 是非常有用的一个功能,因为它可以让你提高搜索引擎阅读和索引你的网站的能力;而且在你改变了自己的网站结构后,无需要求用户修改他们的书签,无需其他网站修改它们的友情链接;它还可以提高你的网站的安全性。

内置变量

$request            # HTTP请求行,如"GET / HTTP/1.1"
$request_method     # HTTP请求方法,如"GET"、"POST"
$request_uri        # HTTP请求URI,带查询参数
$request_filename   # HTTP请求文件,如"/path/to/index.html"
$content_type       # HTTP报头"Content-Type"字段
$content_length     # HTTP报头"Content-Length"字段
$http_cookie        # HTTP报头"Cookie"字段
$http_user_agent    # HTTP报头"User-Agent"字段

$server_protocol    # 服务器HTTP版本,如"HTTP/1.0"、"HTTP/1.1"
$server_name        # 服务器Host名
$server_addr        # 服务器IP地址
$server_port        # 服务器Port号

$remote_addr        # 客户端IP地址
$remote_port        # 客户端Port号
$remote_user        # 客户端User名(认证)

$scheme             # 请求的协议类型,如"http"、"https"
$host               # 请求的虚拟主机
$uri                # 请求的URI,不带参数
$args               # 请求的参数
$query_string       # 请求的参数,同 $args

$document_uri       # 请求的URI,不带参数,同 $uri
$document_root      # 请求的根目录

$status             # HTTP响应码,如 200

匹配规则

rewrite 写在 server、location、if 字段中

~           # 正则匹配
~*          # 正则匹配(忽略大小写)
!~          # 正则取反
!~*         # 正则取反(忽略大小写)

-f和!-f     # 判断是否为文件
-d和!-d     # 判断是否为目录
-e和!-e     # 判断文件是否存在
-x和!-x     # 判断文件是否可执行

set         # 设置变量
last        # 完成rewrite
break       # 终止匹配

return      # 返回状态码
redirect    # 返回302临时重定向
permanent   # 返回301永久重定向

### last break 区别 ###
last
    重新将 rewrite 后的 url 在 server 标签中执行
break
    将 rewrite 后的地址在当前 location 标签中执行

因此,在 server 标签中的 last 和 break 没区别,它们的区别只体现在 location 字段:
在 location 中,last 将返回 server 标签重新执行一遍;break 则只在当前 location 标签中执行一遍。

重写实例