nginx location 匹配模式,root, alias
官方文档:Alphabetical index of directives
中文地址:Nginx中文文档
nginx root相对地址是相对于 当前配置文件的,要使用相对地址就应该以../开头,即当前配置文件的上一层目录
nginx root 对 匹配到的uri是追加效果。
nginx alias 对 匹配到的uri是替换效果 注意alias 值的结尾 /或者非/ 如果不是/,那么alias对应的是一个文件
nginx location 匹配模式
location =
location 完整路径
location ^~
location ~|~*
location 部分起始路径
loaction /
#其中优先顺序
(location =) > (location 完整路径) > (location ^~ 路径) > (location ~|~* 正则顺序) > (location 部分起始路径) > (location /)
= #字面精确匹配
^~ #最大前缀匹配
~ #大小写相关的正则匹配
~* #大小写无关的正则匹配
/ #不带任何前缀:最大前缀匹配
@ #location内部重定向的变量
#其中(=)|(^~)|(/) 属于普通字符串匹配(~)|(~*)属于正则表达式匹配。
————————————————
参考:https://blog.csdn.net/wangzhufei/article/details/109998558
nginx.conf nginx配置文件常见配置解析 root、alais、proxy_pass
参考:https://blog.csdn.net/u012294724/article/details/128449646
注意:proxy_pass并不是根据“/”区分什么绝对路径和相对路径,而是根据proxy_pass中是否包含uri来做判断是替换还是追加。详见文中解释。同时还有root与alais的解释。
#user nobody; #指定的用户,如果不写,默认是nobody
worker_processes 1; #启动的worker进程数量。
#error_log logs/error.log; #指定错误日志的存放路径,以及错误日志的级别。如果不写,默认是存储在 nginx安装路径/logs/error.log中。
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid; #存放master pid的文件,如果不写,默认在usr/local/nginx/logs下
events {
# 指单个工作进程可以允许同时建立外部连接的数量,
# 最大并发连接数:max_clients = worker_processes * worker_connections。但是这个最大连接数受操作系统的限制,进程最大可打开的文件数有关。https://blog.csdn.net/liupeifeng3514/article/details/79007079
worker_connections 1024;
}
http {
# 将另一个文件或符合指定掩码mime-type的文件纳入配置.mime.types包含types配置的MIME-type
include mime.types;
# 定义响应的默认MIME类型。文件名扩展名与MIME类型的映射可以用types指令来设置。
# 根据客户端的请求资源的后缀名进行判断(如:123.jpg),根据不同的值在mime.types中找到对应的MIME-type(如:image/jpeg jpeg jpg;),并将MIME-type设置为响应头的content-type(如:image/jpeg),
# 浏览器客户端根据响应头的content-type对返回的资源进行处理(是下载文件,还是渲染页面)。这里的default_type指的是在types中没有定义的类型,则使用默认类型,application/octet-stream表示下载文件
# 资料:https://blog.csdn.net/wzj_110/article/details/112850811
default_type application/octet-stream;
# 日志的存储格式。可以自己将日志输出格式组装成json字符串,方便解析日志使用
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
# 日志的存储位置,如果不写,默认存储在nginx安装目录下的logs文件夹下
#access_log logs/access.log main;
# sendfile系统调用则提供了一种减少拷贝次数,提升文件传输性能的方法。
sendfile on;
#tcp_nopush on;
# 参数指定了与客户端保持连接的超时。服务器将在这个时间之后关闭连接。
keepalive_timeout 65;
# 将响应报文发送至客户端之前开启压缩功能,这能够有效地节约带宽,并提高响应至客户端的速度,默认关闭。
# 可以使网站的css、js 、xml、html文件在传输时进行压缩,提高访问速度, 进而优化Nginx性能。但是对于图片、视频、大文件优化效果不明显,这几类不建议使用
# 开启后需要同时开启gzip_types属性,才可以使压缩功能生效
# 资料:https://www.cnblogs.com/kevingrace/p/10018914.html、https://blog.csdn.net/qq_59636442/article/details/124078426
#gzip on;
#gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php application/javascript application/json;
#gzip_min_length 20k; #设置允许压缩的页面最小字节数; 这里表示如果文件小于10个字节,就不用压缩,因为没有意义,本来就很小.
#gzip_buffers 4 16k; #设置压缩缓冲区大小,此处设置为4个16K内存作为压缩结果流缓存
#gzip_http_version 1.1; #压缩版本
#gzip_comp_level 6; #设置压缩比率,最小为1,处理速度快,传输速度慢;9为最大压缩比,处理速度慢,传输速度快; 这里表示压缩级别,可以是0到9中的任一个,级别越高,压缩就越小,节省了带宽资源,但同时也消耗CPU资源,所以一般折中为6
#gzip_disable "MSIE [1-6]\."; #配置禁用gzip条件,支持正则。此处表示ie6及以下不启用gzip(因为ie低版本不支持)
#gzip_vary on; #选择支持vary header;改选项可以让前端的缓存服务器缓存经过gzip压缩的页面; 这个可以不写,表示在传送数据时,给客户端说明我使用了gzip压缩
# 虚拟服务器(一个nginx可以配置多个虚拟服务器,如果服务器ip对应多级域名,那么不同域名可以对应不同的虚拟服务器)
server {
# 监听的端口号
listen 81;
# 虚拟服务器名称。当开始处理一个http请求时,nginx会取出header中的host(host是浏览器请求地址中的域名或地址),与nginx.conf中的每一个server的server_name进行对比,
# 然后根据server的匹配优先级排序,以此决定到底由哪一个server块来处理这个请求。当然选择一个server的前提是访问端口跟server中listen的端口对应。
# 如果全部都不匹配,1.优先选择相同listen端口,后面标有default或default server的(如listen 80 default)。2.找到匹配listen端口的第一个server块。所以如果只有一个server,那么server_name作用不大
# 参考文章:https://www.cnblogs.com/nextgg/p/16968961.html,https://blog.csdn.net/ThinPikachu/article/details/127326653
# 端口号相同,server_name不同,根据不同的server_name进行判断进入哪个server。
# 一个ip地址可以配置多个域名,那么就可以通过不同的域名对应不同的server_name,从而访问不同的地址;或者可以在hosts文件中把一个地址配置多个对应的域名进行测试
server_name localhost;
# 设置解析文本使用的字符集。该模块将配置的编码添加到响应头"Content-Type"中(如:Content-Type: text/html; charset=utf-8)。该模块表示将一种编码的数据重新编码为另一种编码
#charset utf-8;
# 指定该server的访问日志,如果不写,默认是写到主日志中,logs/access.log中
#access_log logs/host.access.log main;
# location的格式可以包含:location [ = | ~ | ~* | ^~ ] uri { ... }
# 如果使用正则表达式需要使用:~*(大小写不敏感)或者~(大小写敏感)
# location /testpath 等价于 location ^~ /testpath。
# 优先级顺序:= > ^~ /path1/path2/ > ~*、~ (正则表达式按照顺序匹配,使用第一个匹配的 )> /path1/path2(常规匹配)
location / {
# 指定根目录
root html;
# 默认的首页
index index.html index.htm;
}
# location优先级比较:中
location ~* .(jpg|gif|jpeg)$ {
root html;
index index2.html;
}
# location优先级比较:高
location ^~ /testpath/ {
root html;
index index.html;
deny all;
}
# location优先级比较:低
location /testpath/ {
root html;
index index.html;
# 对客户端地址的限制访问。这些规则被依次检查,直到找到第一个匹配项
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
allow 2001:0db8::/32;
deny all;
}
# root:起到追加路径的作用
# 前缀匹配以/i/开头的uri,将最终全路径显示为:root的路径 + uri。如访问/i/111.png,则全路径为:/home/static_data/i/111.png
#
location /i/ {
root /home/static_data;
}
# alias:起到路径替换作用
# 前缀匹配以/i/开头的uri,并且将/i/替换为/home/static_data/,
# 注意:如果匹配的是路径,那么/home/static_data/必须以'/'结尾,否则替换后的uri会少一层路径,导致404找不到文件
location /i/ {
alias /home/static_data/;
}
location /i/111.png {
alias /home/static_data/222.png;
}
# ~ 表示使用正则表达式。
# 使用正则表达式进行路径替换
location ~ ^/users/(.+\.(?:gif|jpe?g|png))$ {
alias /home/static_data/$1;
}
# $uri指的是匹配后的最终访问地址,$request_uri:指的是原始的访问地址
# https://blog.csdn.net/gushaolin/article/details/103777154
# try_files: file1 file2... uri。从file1开始依次匹配,找到第一个存在的文件返回,如果都不存在,则执行最后的uri进行跳转,最后的uri相当于内部redirect
# 注意:file的开头必须有“/”,并且文件的全路径是:root + file1路径 (如:/usr/local/nginx/html + /111.png) ,root可以在location中定义,也可以在全局中定义。
# 如果没有定义root,则默认root是/usr/local/nginx/html
# $uri表示访问的文件,如果在配置的root目录下存在,并且是文件,则返回这个文件;$uri/表示访问的是$uri目录下的index.html文件
# try_files: file1 file2... =code,同时可以将最后的uri替换为code,那么如果都不匹配,则返回给页面该code。(如:try_files $uri $uri/ /index2.html /python.jpg /111.png =405;)
location /images/ {
root /home/static_data/;
# 指访问:ip:81/images/,时的默认页面,index2.html的存放路径:root + /images/index2.html(既:/home/static_data/ + /images/index2.html)
index index2.html;
try_files $uri $uri/ /index2.html /python.jpg /111.png /i/111.png;
}
location /ims/imsBack {
# 如果proxy_pass后面的地址包含uri,那么与location匹配的部分将会被proxy_pass替换(/ims/imsBack会被/nginxtest/替换)
#(如:浏览器请求:http://39.101.198.159:81/ims/imsBack/tt/getR,proxy_pass后:http://localhost:8080/nginxtest/tt/getR。)
# 如果proxy_pass后面的地址不包含uri,那么将会将浏览器请求的uri追加到proxy_pass中。(如果proxy_pass是http://localhost:8080,则最终是:http://localhost:8080/ims/imsBack/tt/getR)
# 注意:http://localhost:8080/ 最后如果有"/",也算是包含uri,这样就会将loaction的部分替换掉。 http://localhost:8080这样就不算包含uri
# 所以浏览器: http://39.101.198.159:81/ims/imsBack/tt/getR,proxy_pass: http://localhost:8080/nginxtest/ 与 浏览器: http://39.101.198.159:81/nginxtest/tt/getR,proxy_pass: http://localhost:8080效果相同
proxy_pass http://localhost:8080/nginxtest/;
# proxy_set_header field value,允许重新定义或者添加发往后端服务器的请求头中
# 设置请求的地址,如果不设置默认是代理服务器的地址。$proxy_host:代理服务器的地址和端口;$host:浏览器请求的ip(按以下顺序排列:来自请求行的主机名称,或来自 "Host "请求头字段的主机名称,或与请求匹配的服务器名称);$http_host 浏览器请求的ip+端口
proxy_set_header Host $host;
# X-Real-Ip指的是客户端真实IP字段,$remote_addr变量可以获取客户端地址
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
# X-Forwarded-For表示追加代理信息的,记录多级ip。是用于记录代理信息的,每经过一级代理(匿名代理除外),代理服务器都会把这次请求的来源IP追加在X-Forwarded-For中
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
# 端口号相同,server_name不同,根据不同的server_name进行判断进入哪个server。
# 一个ip地址可以配置多个域名,那么就可以通过不同的域名对应不同的server_name,从而访问不同的地址;或者可以在hosts文件中把一个地址配置多个对应的域名进行测试
server {
listen 81;
server_name my_server.com;
location / {
root html;
index index2.html index.htm;
}
}
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}