Nginx篇之转发逻辑全面详解

nginx对于收到的请求先匹配ip加port,如果匹配当前有监听IP+端口,然后根据请求的域名匹配转发路径,如果没有匹配到任何域名则转发给默认域名(通常是设置的第一个规则)

可以设置某个域名为默认域名:示例如下:
 

server {
    listen      80
default_server; ##0.8.21版本以前是default
    server_name example.net www.example.net;
    ...
}

 

如果想防止默认域名泄露可以配置如下:# ""会匹配所有,没有精确匹配到域名的请求会转发给这条路径,表示服务端拒绝响应不返回任何信息。

server {
    listen      80;
    server_name "";
    return      444;
}

 

对于location的匹配规则如下:

 

Nginx 首先会搜索最具体的以字面字符串表示的前缀 location,不考虑它们在配置文件中的顺序。在提供的配置中,如果只有一个字面字符串的前缀 location,比如/,那么它会被用作最后一种选择,因为它可以匹配任何请求。

如果没有找到匹配的字面字符串的前缀 location,Nginx 会继续检查配置中按照顺序列出的正则表达式 location。在这种情况下,Nginx 会按照配置文件中列出的顺序逐个检查正则表达式的匹配,第一个匹配成功的正则表达式将被选择,搜索过程会停止,Nginx 会使用该位置处理请求。

如果没有找到匹配的正则表达式 location,Nginx 将返回到最先找到的最具体的前缀 location,即上述第一条中提及的字面字符串的前缀 location。

综上所述,Nginx 在搜索匹配的 location 时会遵循以上规则。优先选择最具体的前缀 location(字面字符串),然后是按照顺序检查正则表达式 location,最后回到原先找到的最具体的前缀 location。这个流程确保了请求被正确地路由到相应的处理位置。

 

在 Nginx 中,无论是字面字符串的前缀 location 还是正则表达式 location,都只会测试请求行中的 URI 部分,而不会包括查询参数部分。这是因为查询字符串中的参数可能以多种方式进行给定,例如:

由于查询参数部分的形式多种多样,所以 Nginx 只会对 URI 部分进行匹配和处理,而忽略查询参数部分。这意味着无论查询参数如何变化,都不会影响 Nginx 对于请求的处理。这种设计保证了 Nginx 在匹配请求时的准确性和一致性,不受查询参数形式的影响。

因此,在配置 Nginx 的 location 时,需要明确考虑只针对请求行中的 URI 部分进行匹配,而不考虑其中的查询参数部分。这样可以确保配置的正确性并避免因查询参数的不同形式而导致匹配错误的情况发生。

总结起来,在这个配置中,对于请求 “/logo.gif”,由于它符合前缀 location 和正则表达式 location 的匹配条件,最终会根据 “root /data/www” 指令将该请求映射到对应的文件并返回给客户端。

综上所述,在这个配置中,对于请求 “/index.php”,它会被匹配到后面的正则表达式 location,然后被传递给 FastCGI 服务器执行。通过设置参数和变量,确保了 FastCGI 服务器能正确执行对应的 PHP 文件,并将结果返回给客户端。

综上所述,在处理请求根路径 “/” 的情况下,Nginx会根据 index 指令的设置在存在不同类型的 index 文件时进行内部重定向,将请求转发到对应的 index 文件上,并重新匹配 location 进行处理。

  • 对于请求 “/”(根路径),它仅会被字面字符串的前缀 location “/” 匹配到,因此会由这个 location 处理这个请求。
  • 接着,根据 index 指令的参数设定和 root 指令的值,Nginx 将会检查是否存在 index 文件。在您描述的情况中,如果文件 “/data/www/index.html” 不存在,但文件 “/data/www/index.php” 存在,那么该指令会执行一个内部重定向到 “/index.php”。
  • 执行内部重定向后,Nginx 会重新搜索匹配的 location,并以重新定向后的请求重新处理。这意味着,对于原始的根路径请求 “/”,Nginx 会按照新请求 “/index.php” 的方式再次匹配 location,并继续处理。
  • 对于请求 “/index.php”,同样会首先匹配到字面字符串的前缀 location “/”,然后再被正则表达式 “.(php)$” 匹配到。由于这个请求以 “.php” 结尾,因此会被正则表达式 location 匹配到,被后面的配置所处理。
  • 这个请求会被传递给一个在 localhost:9000 上监听的 FastCGI 服务器。通过 fastcgi_param 指令设置 FastCGI 参数 SCRIPT_FILENAME 为 “/data/www/index.php”,这样 FastCGI 服务器会执行该文件。
  • 变量 $document_root 的值等于 root 指令的值,即 “/data/www”。而变量 $fastcgi_script_name 的值等于请求的 URI,即 “/index.php”。
  • 对于请求 “/logo.gif”,首先会被字面字符串的前缀 location “/” 匹配到,然后会再由正则表达式 “.(gif|jpg|png)"进行匹配。因为正则表达式"(˙𝑔𝑖𝑓∣𝑗𝑝𝑔∣𝑝𝑛𝑔)"进行匹配。因为正则表达式"(˙​gifjpgpng)” 匹配到了请求中的 “.gif” 部分,说明该请求是一个图片文件(以 .gif、.jpg 或 .png 结尾的请求),所以这个请求会被该正则表达式匹配到,被后面的配置所处理。
  • 使用指令 “root /data/www”,这个请求会被映射到文件系统中的路径 “/data/www” 下的 “logo.gif” 文件。因此,Nginx 将会从文件系统路径 “/data/www/logo.gif” 中获取该文件,并将其发送给客户端作为响应。
  • 等等
  • ?arg1=value1&arg2=value2&arg3=value3
  • ?key1=val1&key2=val2
  • 14
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值