昊鼎王五:nginx location正则表达式进阶写法

#昊鼎王五:nginx location正则表达式进阶写法

##示例及解析:

‘=’ 号 精确匹配 / ,主机名后面不能带任何字符串

location = / {
    [ configuration A ]
}

###匹配到所有请求 (因为所有的地址都以 / 开头,一般放在最末位置)

location / {
    [ configuration B ]
}

匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索

location /documents/ {       #只有后面的正则表达式没有匹配到时,这一条才会采用这一条
    [ configuration C ]
}

###匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索

location ~ /documents/Abc {    #只有后面的正则表达式没有匹配到时,这一条才会采用这一条
		[ configuration CC ]
}

###匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。

location ^~ /images/ {
		[ configuration D ]
}

###匹配所有以 gif,jpg或jpeg 结尾的请求

location ~* \.(gif|jpg|jpeg)$ {     # 然而,所有请求 /images/ 下的图片会被 config D 处理,因为 ^~ 到达不了这一条正则
		[ configuration E ]
}

###字符匹配到 /images/,继续往下,会发现 ^~ 存在

location /images/ {
		[ configuration F ]
}

###最长字符匹配到 /images/abc,继续往下,会发现 ^~ 存在

location /images/abc {   # F与G的放置顺序是没有关系的
		[ configuration G ]
}

只有去掉 config D 才有效:先最长匹配 config G 开头的地址,继续往下搜索,匹配到这一条正则,采用

location ~ /images/abc/ {
		[ configuration H ]
}

###匹配多路径下js的请求

location ~* /js/.*/\.js{
		[ configuration I ]
}

###小结:

	以=开头表示精确匹配,如 A 中只匹配根目录结尾的请求,后面不能带任何字符串。
	以 ^~ 开头表示uri以某个常规字符串开头,不是正则匹配
	以 ~ 开头表示区分大小写的正则匹配;
	以 ~* 开头表示不区分大小写的正则匹配
	以 / 通用匹配, 如果没有其它匹配,任何请求都会匹配到

###顺序 no优先级:
(location =) > (location 完整路径) > (location ^~ 路径) > (location ,* 正则顺序) > (location 部分起始路径) > (/)

###按照上面的location写法,以下的匹配示例成立:

	 / -> config A         #精确完全匹配,即使/index.html也匹配不了
	 /downloads/download.html -> config B  #匹配B以后,往下没有任何匹配,采用B
	 /images/1.gif -> configuration D   #匹配到F,往下匹配到D,停止往下
	 /images/abc/def -> config D   #最长匹配到G,往下匹配D,停止往下,你可以看到 任何以/images/开头的都会匹配到D并停止,FG写在这里是没有任何意义的,H是永远轮不到的,这里只是为了说明匹配顺序
	 /documents/document.html -> config C  #匹配到C,往下没有任何匹配,采用C
	 /documents/1.jpg -> configuration E   #匹配到C,往下正则匹配到E
	 /documents/Abc.jpg -> config CC    #最长匹配到C,往下正则顺序匹配到CC,不会往下到E

###实际使用建议
所以实际使用中,个人觉得至少有三个匹配规则定义,如下:
####1.第一个必选规则是处理静态文件请求,这是nginx作为http服务器的强项

location ^~ /static/ {              								#目录匹配,任选其一
			root /webroot/static/;
}
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {           #后缀匹配,任选其一
			root /webroot/res/;
}

####2.第二个必选规则

location = / {
			proxy_pass http://tomcat:8080/index
}

####3.第三个规则就是通用规则,用来转发动态请求到后端应用服务器

location / {
			proxy_pass http://tomcat:8080/
}

###参考网址:
http://tengine.taobao.org/book/chapter_02.html
http://nginx.org/en/docs/http/ngx_http_rewrite_module.html

好了,聪明如你,知道了如何Nginx 的 Location 进阶配置,是不是很欢喜 _

还有其他问题的可以在评论区留言或者扫码加博主获取资源或者提问。
在这里插入图片描述

### JavaScript 正则表达式使用方法详解 --- #### 1. **正则表达式的定义** 在 JavaScript 中,正则表达式可以过两种方式创建: - 使用字面量语法:`/pattern/modifiers` - 使用构造函数:`new RegExp(pattern, modifiers)` 例如,以下两个表达式是等价的: ```javascript let regexLiteral = /hello/i; let regexConstructor = new RegExp("hello", "i"); ``` 这里的修饰符(modifiers)决定了模式的行为,常见的有: - `g`:全局匹。 - `i`:忽略大小写。 - `m`:多行匹。 --- #### 2. **RegExp 对象的方法** ##### (1) `test()` 该方法测试一个字符串是否与某个正则表达式,返回布尔值。 ```javascript let pattern = /hello/; console.log(pattern.test("hello world")); // true[^2] ``` ##### (2) `exec()` 执行搜索并返回第一个匹的结果及其索引位置。如果没有找到任何匹项,则返回 `null`。 ```javascript let pattern = /e/g; let result = pattern.exec("hello"); console.log(result); // ["e"], index: 1[^1] ``` ##### (3) `compile()` 重新编译正则表达式实例。此方法较少使用,在现代开发中几乎被废弃。 ```javascript let pattern = /hello/; pattern.compile(/hi/); console.log(pattern.test("hi there")); // true[^1] ``` --- #### 3. **字符串对象的相关方法** ##### (1) `match()` 用于检索字符串中与正则表达式的内容。如果设置了 `g` 标志,则返回所有匹项组成的数组;否则只返回首个匹项以及捕获组的信息。 ```javascript let str = "Is this his"; let pattern = /is/ig; console.log(str.match(pattern)); // ["Is", "is", "is"][^3] ``` ##### (2) `search()` 返回首次匹的位置索引,找不到时返回 `-1`。 ```javascript let str = "JavaScript"; let pattern = /java/; console.log(str.search(pattern)); // 0[^2] ``` ##### (3) `replace()` 将匹到的部分替换为新内容。可以是一个固定字符串或者动态生成的新值。 ```javascript let str = "Visit Microsoft!"; let replacedStr = str.replace("Microsoft", "Google"); console.log(replacedStr); // Visit Google![^4] // 动态替换示例 let dynamicReplace = function(match) { return match.toUpperCase(); }; console.log("hello".replace(/[aeiou]/gi, dynamicReplace)); // hEllO ``` ##### (4) `split()` 依据给定的正则分割字符串成数组。 ```javascript let str = "apple, banana, cherry"; let fruitsArray = str.split(/\s*,\s*/); console.log(fruitsArray); // ['apple', 'banana', 'cherry'][^4] ``` --- #### 4. **实际应用场景分析** ##### (1) 工资提取案例 需求是从一段文本中提取所有的工资数值,并存储在一个数组里。 ```javascript let str = "张三:1000,李四:5000,王五:8000。"; let reg = /\d+/g; // 定义正则表达式 console.log(str.match(reg)); // ["1000", "5000", "8000"] ``` 也可以过循环实现更灵活的操作: ```javascript let arr = []; reg.lastIndex = 0; // 初始化 lastIndex 属性 while ((match = reg.exec(str)) !== null) { arr.push(match[0]); } console.log(arr); // ["1000", "5000", "8000"] ``` ##### (2) 替换敏感词 假设要隐藏某些关键词,可以用星号代替。 ```javascript let text = "这是一个秘密信息 secret."; let censoredText = text.replace(/secret/gi, "***"); console.log(censoredText); // 这是一个***信息 ***. ``` --- #### 5. **注意事项** - 当涉及复杂逻辑时,务必注意边界条件和异常情况处理。 - 尽可能优化正则表达式结构以提高效率,避免不必要的回溯行为。 - 调试过程中可借助在线工具辅助理解匹过程。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值