regex - NGINX 位置块正则表达式和代理通行证
问题描述
我希望你们都很好。
我是 NGINX 的初学者,我正在尝试理解以下 NGINX 配置文件块。如果有人能帮助我理解这个块,我将不胜感激。
location ~ ^/search/google(/.*)?$ {
set $proxy_uri $1$is_args$args;
proxy_pass http://google.com$proxy_uri;
}
从以下 SO 文章(https://stackoverflow.com/a/59846239)中,我了解到:
为了
location ~ ^/search/google(/.*)?$
~
表示它将执行正则表达式搜索(区分大小写)^/search/google
意味着路线应该以/search/google
(例如http://<ip or domain>/search/google
。如果我们在末尾有尾随/
(例如http://<ip or domain>/search/google/
,而不是http://<ip or domain>/search/google
(/.*)?$
这是我有点困惑的部分。- 为什么
()
在这种情况下使用组?使用组的常见用例是什么? - 为什么
?
在这种情况下使用?还没有.*
包含零个或更多的字符,为什么我们还需要?
- 我们可以简单地删除
()
and?
以/search/google/.*$
获得与原始行为相同的行为吗?
- 为什么
set $proxy_uri $1$is_args$args;
- 我知道我们正在设置一个名为
proxy_uri
- 什么会
$1
被替换,有时有人还包括$2
等等? - 我认为
$is_args$args
意味着如果有一个查询字符串(即http://<ip or domain>/search/google?fruit=apple
,$is_args$args
将替换为?fruit=apple
- 我知道我们正在设置一个名为
proxy_pass http://google.com$proxy_uri
- 我会假设它只是将用户重定向到
http://google.com$proxy_uri
??? 和 http 重定向 301 一样???
- 我会假设它只是将用户重定向到
非常感谢您!
解决方案
作为一个非英语母语的人,我认为有人会用比我更完美的英语回答你的问题,但由于过去五天没有人这样做,我会尝试自己做。
~
表示它将执行正则表达式搜索(区分大小写)
我认为更正确的术语是“针对正则表达式模式执行匹配”。
^/search/google
意味着路线应该以/search/google
(例如http://<ip or domain>/search/google
。如果我们在末尾有尾随/
(例如http://<ip or domain>/search/google/
,而不是http://<ip or domain>/search/google
下面会一一解答。
为什么
()
在这种情况下使用组?使用组的常见用例是什么?
这是一个编号的捕获组。与该组匹配的字符串的内容稍后可以引用为$1
. 第二个编号的捕获组,存在于正则表达式模式中,可以引用为$2
,依此类推。当您可以使用自己的变量名而不是 , 等时,还存在命名捕获组。在此ServerFault 线程中给出了使用命名捕获组的一个很好的示例。$1
$2
顺便说一句,您引用的答案提到了编号的捕获组(但不是命名的捕获组)。
为什么
?
在这种情况下使用?还没有.*
包含零个或更多的字符,为什么我们还需要?
您是否注意到我们的捕获组是(/.*)
,而不是(.*)
?这样它将匹配/search/google/<any suffix>
但不匹配/search/googles
等。一个问号使这个捕获组成为可选的(/search/google
也将匹配我们的正则表达式模式)。
我们可以简单地删除
()
and?
以/search/google/.*$
获得与原始行为相同的行为吗?
不,因为我们稍后需要那个$1
值。如果您正确理解了上述所有信息,您应该会看到它可以是/<any suffix>
空字符串。
什么会
$1
被替换,有时有人还包括$2
等等?
已经回答了。
我认为
$is_args$args
意味着如果有一个查询字符串(即http://<ip or domain>/search/google?fruit=apple
,$is_args$args
将替换为?fruit=apple
对,就是这样。
我会假设它只是将用户重定向到
http://google.com$proxy_uri
??? 和 http 重定向 301 一样???
完全错误。尽管该答案没有提到您可以在将响应发送到客户端之前额外修改响应(例如,使用模块) ,但此处简要描述了差异。sub_filter
推荐阅读
- python - 构造多方法设置器的pythonic方法
- excel - 如何整理excel表格中的邮政地址?
- java - 带有动态 Jasper 报告的自定义字体 Gotham Messy
- c# - 添加到聚合根时未保存子实体
- c# - LocalDatabase-安装程序安装问题
- ios - CLLocationManager 权限 iOS 11 和 iOS 10
- ajax - Laravel dhtmlxgantt api ajax $user 为空
- python - 我想通过从传递给函数的用户获取数据名称来访问和返回对象的数据
- python - numpy savetext 格式的帮助会产生错误
- php - RESTful API 基于用户角色的不同响应