# ngx_http_rewrite_module
# rewrite
- 执行 server 块的 rewrite 指令
- 执行 location 匹配
- 执行选定的 location 中的 rewrite 指令
如果其中某步 URI 被重写,则重新循环执行 1-3,直到找到真实存在的文件;
如果循环超过 10 次,则返回 500 Internal Server Error 错误。
rewrite regex replacement [flag];
flag 有四种参数可以选择:
last停止处理后续 rewrite 指令集,然后对当前重写的新 URI 在 rewrite 指令集上重新查找。break停止处理后续 rewrite 指令集,并不再重新查找,但是当前 location 内剩余非 rewrite 语句和 location 外的 非rewrite 语句可以执行。redirect如果replacement不是以http://或https://开始,返回302临时重定向permanent返回301永久重定向
rewrite 后的请求参数:
如果替换字符串 replacement 包含新的请求参数,则在它们之后附加先前的请求参数。如果你不想要之前的参数,则在替换字符串 replacement 的末尾放置一个问号,避免附加它们。
# 由于最后加了个 ?,原来的请求参数将不会被追加到 rewrite 之后的 URI 后面
rewrite ^/users/(.*)$ /show?user=$1? last;
# if
- 一个变量名;如果这个变量是空字符串或者以0开始的字符串,则为 false;
- 使用
=,!=比较的一个变量和字符串 - 使用
~,~*与正则表达式匹配的变量,如果这个正则表达式中包含},;则整个表达式需要用"或'包围 - 使用
-f,!-f检查一个文件是否存在 - 使用
-d,!-d检查一个目录是否存在 - 使用
-e,!-e检查一个文件、目录、符号链接是否存在 - 使用
-x,!-x检查一个文件是否可执行
set $is_download_file 0;
if ($request_uri ~* "\.(zip|war|html)$") {
set $is_download_file 1;
}
if ($request_uri !~ "(/)$") {
set $is_download_file 0$is_download_file;
}
if ( $is_download_file = 00 ){
rewrite ^ http://$server_name$request_uri/ last;
}