概述
Location 基础知识:
1.1 概念:
我们可以通过配置location指令块,来决定客户端发送过来的请求URL如何处理
1.2 语法:
Syntax: location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
Default: —
Context: server, location
location 配置可以有两种配置方法,可以在server指令块和location指令块配置。
1、修饰符 + uri(资源路径)
2、@ + name
1.2.1 修饰符
- ~ :大小写敏感(正则表达式)
- = : 精确匹配(必须全部相等)
- ~*:忽略大小写(正则表达式),这里要注意忽略大小写的意思是请求的字符大小写都可以, 但是不会进行大小转换,请求的大小写对应的文件必须存在。
- ^~ :只需匹配uri部分
- @ :内部服务跳转
2.location配置实例
2.1 精确匹配
=,精准匹配,一般是匹配某个具体文件
location = /index.html {
[ configuration ]
}
# 则匹配到`http://www.v1jfedu.com/index.html`这种请求。
2.2 大小写铭感匹配
~ :大小写敏感(正则表达式)
location ~ /LUTIXIA/ {
[ configuration ]
}
#请求示例
#http://www.v1.jfedu.com/LUTIXIA/ [成功]
#http://www.v1.jfedu.com/lutixia/ [失败]
2.3 大小写不敏感匹配
~:忽略大小写(正则表达式)*
location ~* /lutixia.html {
[ configuration ]
}
# 则会忽略 uri 部分的大小写
#http://www.v1.jfedu.com/jfedu.html [成功] 可以成功匹配,但是目录中要lutixia.html文
件
#http://www.v1.jfedu.com/JFEDU.html [成功] 可以成功匹配,但是目录中要LUTIXIA.html文
件
2.4 指定后缀匹配
匹配以gif、jpg、jpeg结尾的文件
location ~* .(gif|jpg|jpeg)$ {
[ configuration ]
}
#http://www.iflytek.com/img/iflytek.jpg [成功]
2.5 忽略正则匹配
location ^~ /img/ {
[ configuration ]
}
#以 /img/ 开头的请求,都会匹配上
#http://www.iflytek.com/img/iflytek.jpg [成功]
#http://www.iflyek.com/img/iflytek.png [成功]
如果配置了2.5,那么所有请求 /img/ 下的图片会被上面的处理,因为 ^~ 指令匹配到了,则不检查正则
表达式。对比这两个location,可以设置不同目录,相同文件进行实验。
3.Location 优先级
以上四个匹配优先级最高的为精准匹配
注释精准匹配,结果如下:
注释忽略正则匹配,结果如下:
注,第二个和的第三个规则都是正则,这时会按照至上而下的顺序匹配。
4.rewrite规则
Nginx的rewrite功能需要pcre软件的支持,即通过perl兼容正则表达式语句进行规则匹配的。
默认参数编译nginx就会支持rewrite的模块,但是也必须要pcre的支持。
rewrite是实现URL重写的关键指令,根据regex(正则表达式)部分内容,重定向到replacement,结尾是flag标记。
rewrite <regex> <replacement> [flag];
正则 替代内容 flag标记
正则:perl兼容正则表达式语句进行规则匹配
替代内容:将正则匹配的内容替换成replacement
flag标记:rewrite支持的flag标记
# flag标记说明:
last #本条规则匹配完成终止当前location的规则,继续向下匹配新的location URI规则
break #本条规则匹配完成即终止,不再匹配后面的任何规则
redirect #返回302临时重定向,浏览器地址会显示跳转后的URL地址,关闭服务,无法重定向。
permanent #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址,关闭服务,依然可以重定向,清除缓存失效
5. rewrite实例:
5.1 实现域名跳转
要求:访问v1.jfedu.net 跳转到 v2.jfedu.net
server {
listen 80;
server_name v1.jfedu.net;
root /home/hadoop/nginx/v1;
index index.html index.htm;
rewrite ^/(.*)$ http://v2.jfedu.net:8082/$1 permanent;
# 正则 ^/(.) 表示匹配所有的请求,匹配成功后,跳转到后面指定的url地址
# $1是取出前面正则表达式分组括号里的内容
charset utf-8;
access_log logs/host.access.log main;
}
############################################################
server {
listen 8082;
server_name v2.jfedu.net;
charset utf-8;
access_log logs/v3.access.log jfedu;
location / {
root /home/hadoop/nginx/v2;
index index.html index.htm;
}
}
###两个server可以同时写在nginx.conf中,为实验方便,
###将server分开在单独两个文件中。前面章节说过 include参数:include vhost/*.conf;
5.2 实现浏览器的语言跳转
要求:当页面为中文语言时,打印this is 中文
server {
listen 80;
server_name v1.jfedu.net;
root /home/hadoop/nginx/v1;
index index.html index.htm;
# rewrite ^/(.*)$ http://v2.jfedu.net:8082/$1 permanent;
charset utf-8;
access_log logs/host.access.log main;
if ( $http_accept_language ~ "^zh-CN" ) {
rewrite ^/$ /zh;
}
if ( $http_accept_language ~ "^en") {
rewrite ^/$ /en;
}
}
在 /home/hadoop/nginx/v1目录下创建目录
mkdir -p /home/nginx/v1/{zh,en}
echo "this is 中文" > /home/nginx/v1/zh/index.html
echo "this is English" > /home/nginx/v1/en/index.html
访问如下:
调整浏览器的语言,结果如下
5.3.实现不同终端跳转
(1) 通过安卓ios等不通的操作系统,访问的页面不同
server {
listen 80;
server_name v1.jfedu.net;
root /home/hadoop/nginx/v1;
index index.html index.htm;
charset utf-8;
access_log logs/host.access.log main;
if ( $http_user_agent ~* "iphone|android") {
rewrite ^/(.*) http://m.jfedu.net/$1;
}
############################################################3
(2) 发布一个手机终端界面:
mkdir -p /home/hadoop/nginx/m
echo "this is iphone" > m/index.html
##################################################
server {
listen 80;
server_name m.jfedu.net;
root /home/hadoop/nginx/m;
index index.html index.htm;
}
重启服务,访问页面,并且切换浏览器为iphone终端:
最后
以上就是勤奋金鱼为你收集整理的Nginx服务器Location规则的全部内容,希望文章能够帮你解决Nginx服务器Location规则所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复