nginx location匹配及rewrite规则
location匹配规则
1. 实例
server{
location = \ {
[配置A]
}
location / {
[配置B]
}
location = /images/ {
[配置C]
}
location ^~ /static/{
[配置D]
}
localtion ~* \.(gif|jpg|png){
[配置E]
}
}
2. location语法规则
语法:
location = | ~ | ~* | ^~ | @ /url/{ //注意 =、~、~*、^~ 、@是location的匹配规则,”|“表示或者
“
......省略其他配置
}
规则说明:
| 符号 | 含义 |
|---|---|
| = | 字面精准匹配,如果匹配,则跳出匹配过程(不再进行正则匹配) |
| ~ | 开头区分大小写的正则匹配 |
| ~* | 开头不区分大小写的正则匹配 |
| ^~ | 开头表示uri以某哥常规字符串开头,理解为匹配url路径即可 |
| / | 通用匹配,在没有正则表达式匹配时,任何请求都会匹配到 |
| @ | 不是普通的location匹配,用于location内部重定向的变量 |
| ~ | 开头区分大小写的正则匹配 |
多个location配置的匹配顺序:
- 首先匹配:"="
- 其次匹配:"^~"
- 再匹配:文件location书写顺序
- 最后把所有请求交给通配符("/")
注意:每次匹配成功后,停止匹配,会按照本匹配的location处理请求
按照上面实例进行说明匹配顺序:
- 首先对比第一个location,如果匹配就会停止匹配,并按照配置A进行处理请求:
location = \ {
[配置A]
}
- 其次对比第二个location,如果匹配就会停止匹配,并按照配置D进行处理请求:
location ^~ /static/{
[配置D]
}
- 再按照顺序依此进行对比,直到找到匹配的才会停止,并按照所匹配的配置*进行处理请求
- 如果以上无任何匹配项则会选择通用选项,并按照所匹配的配置B进行处理请求:
location / {
[配置B]
}
3. 应用举例
- 精准规则(=)
location = / {
root /var/ww/html/;
}
此规则表示只匹配以默认地址进行访问的请求,访问地址:http://NginxIP/
- 匹配url路径(^~)
location ^~ /static/ {
root /var/www/html/static;
}
此规则表示只匹配以" /static/ "开头的地址进行访问的请求,访问地址:http://NginxIP/static/
- 忽略大小写(~*)
location ~* \.(png|gif|jpg){
root /var/www/html/;
}
此规则表示只匹配" *.png | *.gif | *.jpg "的文件,访问地址:http://NginxIP/test.png
location ~* /Test/ {
root /var/www/html/;
}
此规则表示匹配url地址中存在Test的访问请求,不区分大小写test也可以,访问地址:http://NginxIP/test/
- 区分大小写(~)
location ~ /Test/{
root /var/www/html/;
}
此规则表示匹配url地址中存在Test的访问请求,区分大小写,test是进行匹配的,访问地址:http://NginxIP/Test/
- 默认匹配(所有规则都可匹配)
location / {
root /var/www/html;
}
此规则为默认匹配,他可以匹配所有以默认地址访问的链接,访问地址:http://NginxIP/login.html
- 内部跳转(@)
location @index_error{
root /var/www/error/
}
此规则表示匹配以 "/index/ "开头的请求,如果链接状态404,会匹配到这条规则
rewrite规则详解
nginx的rewrite功能和apache一样,rewrite的主要功能是实现RUL地址的重定向。Nginx的rewrite功能是由PCRE软件支持,rewrite模块即ngx_http_rewrite_module模块。从某种意义上可以说为了美观或者搜索引起的友好搜索,提高排名等
1.实例
server{
listen 80;
server_name www.jkyst.xyz jkyst.xyz;
if($host != 'www.jkyst.xyz' ){
rewrite ^/(.*)$ http://www.jkyst.xyz/$1 permanent;
}
location ~.*\.(png|gif|jpg){
return 403;
}
}
2.rewrite语法规则
语法:
rewrite regex replacement [flag]
rewrite:rewrite重写的关键字不可省略
regex:这里写的是正则表达式
replacement:这里是重新内容
flag:这里是最后的flag标记
flag标记说明:
| flag标记 | 说明 |
|---|---|
| last | 也就是apache里的(L)标记,表示完成rewrite,URL地址不会改变 |
| break | 本条规则匹配成功后,会停止匹配,不再匹配后面的规则,URL地址不会改变 |
| redirect | 返回302临时重定向,浏览器地址会显示跳转后的URL地址 |
| permanent | 返回301永久重定向,浏览器地址栏显示跳转后的URL地址,Nginx返回response状态码301 |
相关符号说明:
| 符号 | 说明 |
|---|---|
| * | 代表前面0或者多个字符 |
| + | 代表前面1或者多个字符 |
| ? | 代表前面0或1个字符 |
| ^ | 代表字符串的开始位置 |
| $ | 代表字符串结束位置 |
| $n | 代表字符串结束第n个参数 |
| . | 通配符,代表任何字符 |
3.应用实例
- 多域名跳转到同一域名
server{
listen 80;
server_name www.jkyst.xyz jkyst.xyz abc.jkyst.xyz;
if($host != 'www.jkyst.xyz'){
rewrite ^/(.*)$ http://www,jkyst.xyz/$1 permanent;
}
}
当访问 "abc.jkyst.xyz" 时会自动跳转到 "www.jkyst.xyz",这里出现 "if" 语句用于判断,判断结果为true则执行语句内部的 rewrite重写
- 当文件不存在时重定向到指定文件
server{
listen 80;
server_name www.jkyst.xyz;
if(!-e $request_filename){
rewrite ^/test/(.*)$ http://www.jkyst.xyz/test1/$1 permanent;
}
}
当访问 "test" 目录下的文件或目录不存在时,则跳转到 "test1"下面的此文件或者目录,跳转后会将URL进行转换
server{
listen 80;
server_name www.jkyst.xyz;
if(!-e $request_filename){
rewrite ^/test/(.*)$ index.html last;
}
}
表示当访问 "test" 目录下的文件或目录不存在时,则重定向到 "index.html"文件,跳转后URl不会进行转换
server{
listen 80;
server_name www.jkyst.xyz;
if(!-e $request_filename){
rewrite ^/test/([0-9a-z]+)/([0-9a-z]+)/(.*)$ http://www.jkyst.xyz/test/$1$2$3 permanent;
}
}
目录切换,表示将原目录转换成其他目录,【0-9a-z】表示转换后目录名称
- 禁止访问.sh后缀的文件
server{
......其他配置
location ~.*\.(sh)${
return 405;
}
}
表示当访问 "*.sh"的文件就会返回405错误
- 匹配用户浏览器代理信息
server{
listen 80;
server_name www.jkyst.xyz;
if ( $http_user_agent ~* ("Android")|(iPhone)){
rewrite ^/test/(.*)$ http://www.jkyst.xyz/test/$1 permanent;
}
}
表示当匹配到浏览代理为Android和iPhone时进行重定向 "test"目录下的文件,改变访问的地址
- 禁止htaccess
server{
location ~//.ht {
deny all;
}
}
4.文件目录匹配
| 参数 | 介绍 |
|---|---|
| -f | 判断文件是否存在 返回值true为存在 |
| !-f | 判断文件是否存在 返回值false为不存在 |
| -d | 判断目录是否存在 返回值true为存在 |
| !-d | 判断目录是否存在 返回值true为不存在 |
| -e | 判断文件或目录是否存在 返回值true为存在 |
| !-e | 判断文件或目录是否存在 返回值true为不存在 |
| -x | 判断文件是否可执行 返回值true为可执行 |
| !-x | 判断文件是否可执行 返回值true为不可执行 |
举例说明:
server{
listen 80;
server_name www.jkyst.xyz;
if(!-e $request_filename){
rewrite ^/test/(.*)$ http://www.jkyst.xyz/test1/$1 permanent;
}
}
判断文件或目录是否存在
nginx location匹配及rewrite规则的更多相关文章
- Nginx location 匹配规则
1. default_server: 当请求没有匹配到服务器中配置的任何一个server的时候,会默认把请求route到配置了default_server的virtual host中.参考地址:htt ...
- nginx配置location总结及rewrite规则写法【转】
转自 nginx配置location总结及rewrite规则写法 | Sean's Noteshttp://seanlook.com/2015/05/17/nginx-location-rewrite ...
- Nginx中的 location 匹配和 rewrite 重写跳转
Nginx中的location匹配和rewrite重写跳转 1.常用的Nginx正则表达式 2.location 3.rewrite 4.rewrite实例 1.常用的Nginx正则表达式: ^ :匹 ...
- Nginx 常用全局变量 及Rewrite规则详解
每次都很容易忘记Nginx的变量,下面列出来了一些常用 $remote_addr //获取客户端ip $binary_remote_addr //客户端ip(二进制) $remote_port //客 ...
- nginx location匹配顺序及CI框架的nginx配置
Nginx location匹配顺序如下: 用前缀字符串定义的location规则对URI进行匹配测试. =号定义了精确的前缀字符串匹配,如果发现精确匹配则使用当前规则.否则继续下一步匹配. 匹配其它 ...
- Nginx与Apache的Rewrite规则的区别
一.Nginx Rewrite规则相关指令 Nginx Rewrite规则相关指令有if.rewrite.set.return.break等,其中rewrite是最关键的指令.一个简单的Nginx R ...
- Nginx配置location总结及rewrite规则写法
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 32.0px "Helvetica Neue"; color: #323333 } p. ...
- 转:Nginx 配置 location 总结及 rewrite 规则写法
转: http://www.linuxidc.com/Linux/2015-06/119398.htm 1. location正则写法 一个示例: location =/{ # 精确匹配 / ,主机名 ...
- 【转】nginx配置location总结及rewrite规则写法
原文:http://seanlook.com/2015/05/17/nginx-location-rewrite/ 1. location正则写法 location = / { # 精确匹配 / ,主 ...
随机推荐
- ABP前端-关于不同按钮调用同一事件传入的参数变为相同的数据
现象: 在一个含有的Tab标签的页面,两个标签页的新增按钮调用同一个新增事件并传入不同的参数,但实际在调用的的时候传入的参数都变成了最后一个按钮传入的值,即,不论点击哪个Tab按钮的新增事件,最终传入 ...
- python报错bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: lxml.
qpython运行 原代码: soup = BeautifulSoup(r.text,'lxml') 报错:bs4.FeatureNotFound: Couldn't find a tree b ...
- H5_0021:判断平台和微信
1,跳网站: <script>eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c ...
- mongoose pushall不支持的错误记录
该错误发生两次,第一次解决以后第二次碰到又没有想起来怎么解决. 因为采用mongoose+node的后端项目.有两个表实现多对多关系,再中间表不做关联,只在两个主表做了 testlist: [{ ty ...
- Linux系统下的CPU、内存、IO、网络的压力测试
本文转载自:小豆芽博客 一.对CPU进行简单测试: 1.通过bc命令计算特别函数 例:计算圆周率 echo "scale=5000; 4*a(1)" | bc -l -q MATH ...
- 纪中5日T3 1566. 幸运锁(lucky.pas/c/cpp)
1566. 幸运锁(lucky.pas/c/cpp) 题目描述 有一把幸运锁,打开它将会给你带来好运,但开锁时需要输入一个正整数(没有前导0).幸运锁有一种运算,对于一个正整数,返回他的相邻两位数字间 ...
- 剑指offer-面试题10-斐波那契数列-递归循环
/* 题目:求斐波那契数列的第n项 */ /* 思路: f(n) = 0 n=0, 1 n=1, f(n-1) + f(n-2) n>1 */ int Fibonacci(int n){ if( ...
- CodeForces - 1109A
#include<cstdio> #include<map> #include<iostream> #include<algorithm> using ...
- Linux之docker搭建
1.docker运行环境 CentOS7(64-bit),要求系统为64位,系统内核版本为3.10以上 查看系统版本:cat /etc/centos-release 查看系统内核版本:uname -a ...
- Wannafly Camp 2020 Day 3I N门问题 - 概率论,扩展中国剩余定理
有一个猜奖者和一个主持人,一共有 \(n\) 扇门,只有一扇门后面有奖,主持人事先知道哪扇门后有奖,而猜奖者不知道.每一轮,猜奖者选择它认为的有奖概率最大(如果有多个最大,随机选一个)的一扇门,主持人 ...