nginx 学习笔记
location
syntax: location [ ~ | ~* | ^~ | = ] /uri/ { ... }
-
无前缀
literal string
匹配- 匹配成功后仍会进行后续匹配, 如果后续存在优先级更高的匹配, 则会采用优先级高的匹配, 不存在才会采用该匹配
- 匹配优先级见官网文档 ngx_http_core_module #location
-
~
和~*
- 正则匹配
- 匹配成功后仍会进行后续匹配, 如果后续存在优先级更高的匹配, 则会采用优先级高的匹配, 不存在才会采用该匹配
~
: 大小写敏感~*
: 大小写不敏感
-
^~
- 区别于
~
, 匹配成功则立即终止匹配
- 区别于
-
=
- 仅匹配
exact query
- 匹配成功则立即终止匹配
- 仅匹配
alias
location /i/ {
alias /path/to/images/;
}
# 剩余 location 直接拼接到 alias
# request /i/top.gif
# return /path/to/images/top.gif
alias
指令不能用在指定正则的 location
中;
指定正则的 location
中需要使用 rewrite
+ root
;
root
location /i/ {
root /path/to/images;
}
# 整个 location 直接拼接到 root
# request /i/top.gif
# return /path/to/images/i/top.gif
rewrite
- 当
rewrite
位于server
下时, 可以使用last
标记来中止rewrite
;server { # ... rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last; rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last; return 403; # ... }
- 当
rewrite
位于location
下时, 需要把last
换成break
;location /download/ { rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break; rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra break; return 403; }
- 当
replacement
包含新的arguments
时, 需要在结尾添加?
, 因为原arguments
会直接拼接到replacement
后面rewrite ^/users/(.*)$ /show?user=$1? last;
proxy_pass
- proxy_pass 最后有 "/", 则将 剩余 location 拼接到 proxy_pass
- proxy_pass 最后没有 "/":
- 如果结尾是 host, 则将 整个 location 拼接到 proxy_pass
- 如果结尾是 path, 则将 剩余 location 拼接到 proxy_pass
try_files
location / {
try_files index.html index.htm @whatever_fallback;
}
location @whatever_fallback {
root /var/www/error;
index index.html;
}
- @whatever_fallback 是
具名location
(named location
) - 尝试检测指定文件是否存在, 返回第一个存在的文件;
- 如果都不存在, 将会调用
@fallback location
;
部分内置变量
$args
(等同于$query_string
)请求参数
$request_filename
基于
root / alias
和request URI
的当前file path
$request_uri
包括
arguments
的完整初始uri
(complete initial URI
)$uri
当前
uri
不同于initial uri
, 因为可能经过了内部重定向
tips
- It is important to know that nginx does the comparison against decoded URIs. For example, if you wish to match
/images/%20/test
, then you must use/images/ /test
to determine the location.