Nginx alias root 和 try_files 基本使用
请求都用域名
test.com
root
http://nginx.org/en/docs/http/ngx_http_core_module.html#root
语法
Syntax: root path;
Default:
root html;
Context: http, server, location, if in location
一般配置
location /i/ {
root /data/w3;
}
请求 /i/top.gif
是找到文件 data/w3/i/top.gif
。
root 实现的是url 拼接。
location /mainland/pgc/ {
root /tmp/pgc/pgc/;
}
请求 http://test.com/mainland/pgc/
实际目录为 /tmp/pgc/pgc/mainland/pgc/index.html
alias
http://nginx.org/en/docs/http/ngx_http_core_module.html#alias
语法
Syntax: alias path;
Default: —
Context: location
一般配置
location /i/ {
alias /data/w3/images/;
}
请求 /i/top.gif
是找到文件 /data/w3/images/top.gif
。
注意: alias 末尾需要增加 /
增加正则
官网文档
if alias is used inside a location defined with a regular expression then such regular expression should contain captures and alias should refer to these captures (0.7.40), for example:
location ~ ^/users/(.+\.(?:gif|jpe?g|png))$ {
alias /data/w3/images/$1;
}
注意点: 当我们使用了正则,然后使用 alias ,我们必须在 alias 中使用正则的变量,
实际测试
nginx 版本: 1.12.2
当 nginx location 正则
alias
和 try_files
, 存在排斥情况。
示例
访问URL: /mainland/pgc/index.html
location ~ (/(zh-cn|zh-hk|en|mainland))?/pgc/(.*) {
alias /www/dev/mainland/pgc/$3;
try_files $uri /mainland/pgc/$3;
index index.html index.htm;
}
上面正则中 $1 和$2
都是 mainland, $3的值为 index.html
。
根据上面配置后, 访问 /mainland/pgc/index.html
,报错为
2021/08/30 16:38:32 [error] 18570#0: *1249587 rewrite or internal redirection cycle while internally redirecting to "/mainland/pgc/index.html", client: 10.210.20.112, server: usmart-dev.baidu.com, request: "GET /mainland/pgc/index.html HTTP/1.1", host: "usmart-dev.baidu.com"
当我去除掉 try_files
, 也就是如下配置时
location ~ (/(zh-cn|zh-hk|en|mainland))?/pgc/(.*) {
alias /www/dev/mainland/pgc/$3;
index index.html index.htm;
}
访问 /mainland/pgc/index.html
,正常。
正则使用变量名
location ~ (?<product>/(zh-cn|zh-hk|en|mainland))?/pgc/(?<page>.*) {
alias /www/dev/mainland/pgc/$page;
index index.html index.htm;
}
try_files
http://nginx.org/en/docs/http/ngx_http_core_module.html#try_files
语法
Syntax: try_files file ... uri;
try_files file ... =code;
Default: —
Context: server, location
按指定顺序检查文件是否存在,并使用第一个找到的文件进行请求处理。处理的基于上下文处理的。文件的路径是file 根据前面的 root 和 alias 指令作为参数构建的。可以通过在名称末尾,指定斜杠来检查目录是否存在, 例如 $uri/
, 如果没有找到任何文件, URL 则进行到最后一个参数中指定的内部重定向。 最后一个参数可以是URL 也可以是一个 code.
URL:
location / {
try_files $uri $uri/index.html /test/index.html;
}
code:
location / {
try_files $uri $uri/index.html $uri.html =404;
}
Example in proxying Mongrel:
location / {
try_files /system/maintenance.html
$uri $uri/index.html $uri.html
@mongrel;
}
location @mongrel {
proxy_pass http://mongrel;
}
一般配置:
try_files $uri $uri/ /index.html;