重写 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 标签中执行一遍。
重写实例