目录一、Nginx—Rewrite概述1、常用的Nginx正则表达式2、Rewrite功能3、Rewrite跳转实现4、Rewrite执行顺序和语法格式二、location概述1、location分类2、location 常用的匹配规则3、location 优先级案例一案例二案例三案例四案例五案例六案例七案例八案例九三、Nginx 常见网站配置示例3.1、网站根目录匹配规则3.2、静态文件处理规则3.3、动态请求转发规则四、Rewrite 案例1、基于域名的跳转2、基于客户端 IP 访问跳转3、基于旧域名跳转到新域名后面加目录4、基于参数匹配的跳转5、基于目录下所有 php 结尾的文件跳转6、基于最普通一条 url 请求的跳转一、Nginx—Rewrite概述1、常用的Nginx正则表达式^匹配输入字符串的起始位置$匹配输入字符串的结束位置*匹配前面的字符零次或多次匹配前面的字符一次或多次匹配前面的字符零次或一次.匹配除 之外的任何单个字符转义字符使后面的字符被视为普通字符或特殊字符d匹配数字相当于[0-9]{n}匹配前面的字符恰好 n 次{n,}匹配前面的字符至少 n 次{n,m}匹配前面的字符至少 n 次至多 m 次[]定义字符集匹配括号内的任意单个字符[c]匹配单个字符 c[a-z]匹配小写字母中的任意一个[a-zA-Z0-9]匹配所有大小写字母或数字()组括号分组和捕获子表达式2、Rewrite功能①、使用nginx提供的全局变量或自己设置的变量结合正则表达式和标记位实现URL重写以及重定向。比如更换域名后需要保持旧的域名能跳转到新的域名上、某网页发生改变需要跳转到新的页面、网站防盗链等等需求。②、rewrite只能放在server{},location{},if{}中并且默认只能对域名后边的除去传递的参数外的字符串起作用例如http://www.kgc.com/abc/bbs/index.phpa1b2只对/abc/bbs/index.php重写。3、Rewrite跳转实现ngx_http_rewrite_module模块支持 URL 重写和条件判断。通过if指令支持条件判断但不支持else。URL 跳转可以在location块中使用rewrite指令实现从一个location跳转到另一个location。跳转循环最多执行 10 次超过 10 次会导致 Nginx 返回 500 错误。PCRE 支持支持 Perl 兼容正则表达式PCRE语法规则进行匹配。set指令用于创建新的变量并设定其值。4、Rewrite执行顺序和语法格式①、执行顺序执行server块中的rewrite指令在server块中定义的rewrite指令首先被执行用于处理请求。执行location匹配根据请求的 URINginx 会匹配最合适的location块。执行选定的location中的rewrite指令在匹配到的location块中执行该块内定义的rewrite指令。②、语法格式rewrite regex replacement [flag];regex表示用于匹配请求 URL 的正则表达式规则。replacement表示 URL 重写后的目标内容或路径。flag可选用于指定重写的标志影响重写操作的行为。常见标志包括last停止当前location的匹配过程重新选择合适的location。break停止当前location的匹配过程并继续执行当前location中的其他指令。redirect发出一个临时的 302 重定向响应。permanent发出一个永久的 301 重定向响应。二、location概述1、location分类①、精准匹配语法location / {...}说明严格匹配指定的 URI只有当请求的 URI 完全匹配时才会应用该location块中的配置。②、一般匹配语法location / {...}说明前缀匹配请求的 URI 以指定的前缀开头时会匹配该location块。适用于大多数简单的 URI 匹配情况。③、正则匹配语法location ~ /regex {...}说明使用正则表达式进行匹配适用于复杂的 URI 匹配场景。正则匹配会在一般匹配后进行。2、location 常用的匹配规则匹配规则说明示例精确匹配 URIURI 必须完全匹配时才应用location /yudh { … }^~普通字符前缀匹配匹配成功后停止其他 location 匹配location ^~ /images/ { … }~区分大小写的正则表达式匹配location ~ .jpg$ { … }~*不区分大小写的正则表达式匹配location ~* .jPg$ { … }!~区分大小写的正则表达式匹配取非location !~ .jpg$ { … }!~*不区分大小写的正则表达式匹配取非location !~* .jPg$ { … }3、location 优先级首先精确匹配 其次前缀匹配 ^~其次是按文件中顺序的正则匹配或*然后匹配不带任何修饰的前缀匹配 abc最后是交给 / 通用匹配 /案例一****location /http://www.kgc.com/data { # 配置 } location /abc { # 配置 }location /http://www.kgc.com/data它不匹配/data因为location /http://www.kgc.com/data为精确匹配 / 主机名后面不能带任何字符串比如访问 / 和 /data则 / 匹配/data 不匹配。再比如location /abc它只匹配/abc /abc/或 /abcd不匹配。若location/abc则即匹配/abc 或/abcd/ 同时也匹配。案例二location / { # 配置 }比如有以下三个地址http://www.kgc.com/datahttp://www.kgc.com/data/abc/a/usr/local/nginx/html/data/abc因为所有的地址都以 / 开头所以这条规则将匹配到所有请求 比如访问 / 和 /data, 则 / 匹配/data 也匹配。但若后面是正则表达式会和最长字符串优先匹配最长匹配案例三location /documents/ { # 配置 }比如有以下一个地址http://www.kgc.com/documents/abc它匹配任何以 /documents/ 开头的地址匹配符合以后还要继续往下搜索其它 location只有其它 location后面的正则表达式没有匹配到时才会采用这一条。案例四location /documents/abc { # 配置 }匹配任何以 /documents/abc 开头的地址匹配符合以后还要继续往下搜索其它 location只有其它 location后面的正则表达式没有匹配到时才会采用这一条。案例五location ^~ /images/ { # 配置 }匹配任何以 /images/ 开头的地址匹配符合以后停止往下搜索正则采用这一条。案例六location ~* .(gif|jpg|jpeg)$ { # 配置 }匹配所有以 gif、jpg或jpeg 结尾的请求然而所有请求 /images/ 下的图片会被 location ^~ /images/ 处理因为 ^~ 的优先级更高所以到达不了这一条正则。案例七location /images/abc { # 配置 }最长字符匹配到 /images/abc优先级最低继续往下搜索其它 location会发现 ^~ 和 ~ 存在。案例八location ~ /images/abc { # 配置 }匹配以/images/abc 开头的优先级次之只有去掉 location ^~ /images/ 才会采用这一条。案例九location /images/abc/1.html { # 配置 } location ~ /images/abc/1.html { # 配置 }匹配/images/abc/1.html 文件如果和正则location ~ /images/abc/1.html 相比正则优先级更高优先级总结(location 完整路径) (location ^~ 路径) (location ~,~* 正则顺序) (location 部分起始路径) (location /)location 匹配顺序首先看 优先级精确前缀正则一般通用优先级相同正则看上下顺序上面的优先一般匹配看长度最长匹配的优先精确、前缀、正则、一般 都没有匹配到最后再看通用匹配 一般匹配三、Nginx 常见网站配置示例在实际网站的 Nginx 配置中通常至少会定义三个匹配规则以实现高效的请求处理。这些规则包括首页的匹配规则、静态文件的处理规则以及动态请求的转发规则。3.1、网站根目录匹配规则这个规则用于直接匹配网站的根目录/通常用于访问网站首页。因为通过域名访问网站首页的请求较为频繁使用这个规则可以加速处理。首页可以是一个静态页面也可以转发到后端应用服务器。location / { ? ? root html; ? ? index index.html index.htm; }解释当请求 URI 为/时Nginx 会寻找html目录下的index.html或index.htm作为首页响应。如果有必要这个请求也可以被转发到后端服务器进行处理。3.2、静态文件处理规则Nginx 作为 HTTP 服务器处理静态文件请求是其强项。可以通过目录匹配或后缀匹配来处理静态资源请求任选其一或搭配使用。目录匹配匹配以/static/开头的请求将其映射到文件系统的/webroot/static/目录。location ^~ /static/ { ? ? root /webroot/static/; }后缀匹配匹配特定后缀的请求如.html、.gif、.jpg等将这些请求映射到文件系统的/webroot/res/目录。location ~* .(html|gif|jpg|jpeg|png|css|js|ico)$ { ? ? root /webroot/res/; }解释目录匹配主要用于静态资源的路径匹配后缀匹配则用于对特定类型文件的请求匹配。根据实际需求可以选择一种或两种方式组合使用。3.3、动态请求转发规则对于非静态文件的请求通常会默认认为是动态请求这类请求需要转发到后端应用服务器进行处理。例如将带有.php或.jsp后缀的请求转发给 Tomcat 等后端服务器。location / { ? ? proxy_pass http://tomcat_server; }解释这个通用规则将所有未匹配到前面规则的请求即大多数动态请求转发到后端应用服务器http://tomcat_server进行处理。四、Rewrite 案例1、基于域名的跳转在某些情况下可能需要将旧域名的所有请求重定向到新域名并且保持 URL 中的参数不变。以下是一个 Nginx 配置示例用于将旧域名www.kgc.com的请求永久重定向到新域名。编辑 Nginx 配置文件vim /usr/local/nginx/conf/nginx.conf设置 Nginx 服务器块server { listen 80; server_name www.kgc.com; //旧域名 charset utf-8; access_log /var/log/nginx/www.kgc.com-access.log; //设置访问日志 location / { //添加域名重定向逻辑// if ($host www.kgc.com) { //$host 变量表示请求的主机名 rewrite ^/(.*)$ http://www.benet.com/$1 permanent; //将旧域名的请求重定向到新域名保持参数不变 } root html; index index.html index.htm; } }更新/etc/hosts文件echo 172.16.88.22 www.kgc.com www.benet.com /etc/hosts重启 Nginx 服务并测试systemctl reload nginx在浏览器中访问旧域名如http://www.kgc.com/test/1.html你将会看到页面自动跳转到http://www.benet.com/test/1.html并且浏览器的开发者工具中会显示返回的 301 状态码表示实现了永久重定向。2、基于客户端 IP 访问跳转在某些情况下可能需要根据客户端的 IP 地址来控制对网站的访问。例如新的业务版本上线期间所有的访问都需要跳转到维护页面只有特定的公司 IP 地址可以正常访问网站。以下是 Nginx 的配置示例用于实现这个需求。首先打开 Nginx 的主配置文件nginx.conf并进行编辑vim /usr/local/nginx/conf/nginx.conf在配置文件中添加如下的server块配置用于处理旧域名的请求并将其重定向到新域名。server { listen 80; server_name www.kgc.com; //设置域名 charset utf-8; access_log /var/log/nginx/www.kgc.com-access.log; //设置访问日志 //设置 IP 访问控制变量 set $rewrite true; //默认所有 IP 需要重定向到维护页面 # 判断是否为合法 IP 地址 if ($remote_addr 172.16.88.22) { //如果客户端 IP 为 172.16.88.22 set $rewrite false; //不进行重写允许正常访问 } //对于非法 IP 地址进行重写跳转 if ($rewrite true) { //如果变量 $rewrite 仍为 true rewrite (.) /weihu.html; //重定向到维护页面 } //配置维护页面的 location location /weihu.html { root /var/www/html; //设置维护页面文件所在目录 } //配置正常访问的 location location / { root html; //设置正常网站的根目录 index index.html index.htm; } }在/var/www/html/目录下创建一个简单的维护页面mkdir -p /var/www/html/ echo h1We are maintaining now!/h1 /var/www/html/weihu.html重启 Nginx 服务并测试systemctl restart nginx访问网站时只有 IP 为 172.16.88.22的用户 能够正常访问网站的内容。其他所有 IP 的访问请求都会被重定向到/weihu.html维护页面并显示维护信息We are maintaining now!。3、基于旧域名跳转到新域名后面加目录当旧域名需要重定向到新域名的特定路径时可以使用 Nginx 的rewrite指令进行配置。以下是如何将旧域名http://bbs.kgc.com/post/下的所有请求跳转到新域名。打开 Nginx 的主配置文件nginx.conf并进行编辑vim /usr/local/nginx/conf/nginx.conf在配置文件中添加如下的server块配置用于处理旧域名的重定向server { listen 80; server_name bbs.kgc.com; //旧域名 charset utf-8; access_log /var/log/nginx/www.kgc.com-access.log; //设置访问日志 //设置旧域名下 /post 的重定向规则 location /post { rewrite ^/post(.*)$ http://www.kgc.com/bbs/post$1 permanent; //进行永久重定向 } //配置其他请求的处理 location / { root html; index index.html index.htm; } }在新域名的对应路径下创建一个测试文件mkdir -p /usr/local/nginx/html/bbs/post echo this is 1.html /usr/local/nginx/html/bbs/post/1.html修改本地hosts文件为了在本地测试将旧域名映射到本地服务器的 IP 地址echo 172.16.88.22 bbs.kgc.com /etc/hosts重启 Nginx 服务并测试systemctl restart nginx在浏览器中访问http://bbs.kgc.com/post/1.html。你应该会被重定向到http://www.kgc.com/bbs/post/1.html。这表明重定向规则已经成功应用并且旧域名的请求被正确地转发到了新域名下的相应路径。4、基于参数匹配的跳转在实际应用中有时需要根据特定的 URL 参数模式将用户请求重定向到其他页面。下面是如何使用 Nginx 的rewrite指令实现这样的需求将访问http://www.kgc.com/100-(100|200)-100.html的请求重定向到http://www.kgc.com首页。打开 Nginx 的主配置文件nginx.conf并进行编辑vim /usr/local/nginx/conf/nginx.conf在配置文件中添加如下的server块配置用于处理基于参数匹配的跳转server { listen 80; server_name www.kgc.com; //域名设置 charset utf-8; access_log /var/log/nginx/www.kgc.com-access.log; //设置访问日志 # 设置基于参数匹配的跳转规则 if ($request_uri ~ ^/100-(100|200)-(d).html$) { rewrite (.) http://www.kgc.com permanent; //重定向到首页 } # 配置其他请求的处理 location / { root html; index index.html index.htm; } }$request_uri表示包含请求参数的原始 URI不包含主机名。if ($request_uri ~ ^/100-(100|200)-(d).html$)匹配 URL 中符合100-100-100.html或100-200-100.html模式的请求。rewrite (.) http://www.kgc.com permanent;将符合条件的请求永久重定向到http://www.kgc.com首页。重启 Nginx 服务并测试systemctl restart nginx使用浏览器访问以下链接http://www.kgc.com/100-100-100.htmlhttp://www.kgc.com/100-200-100.html两者均应被重定向到http://www.kgc.com首页表明 Nginx 已成功匹配并重定向请求。Nginx 相关变量解释$request_uri包含原始请求 URI 和参数如/abc/bbs/index.html?a1b2。$uri仅包含请求的路径部分不包含参数如/abc/bbs/index.html。**d o c u m e n t _ u r i ∗ ∗ 与 ‘ document\_uri**与 document_uri∗∗与‘uri 相同表示当前请求的路径部分不包含参数。5、基于目录下所有 php 结尾的文件跳转在某些情况下可能需要将访问特定目录下所有以.php结尾的文件请求重定向到网站首页。以下是如何在 Nginx 中配置这类跳转的详细步骤。首先打开 Nginx 的主配置文件nginx.conf进行编辑vim /usr/local/nginx/conf/nginx.conf在配置文件中添加如下的server块用于处理对特定目录下.php文件的重定向server { listen 80; server_name www.kgc.com; # 设置域名 charset utf-8; access_log /var/log/nginx/www.kgc.com-access.log; # 设置访问日志 # 配置对 /upload/ 目录下所有 .php 文件的跳转 location ~* /upload/.*.php$ { rewrite (.) http://www.kgc.com permanent; # 将匹配的请求永久重定向到首页 } # 配置其他请求的处理 location / { root html; index index.html index.htm; } }location ~* /upload/.*.php$该行定义了对/upload/目录下所有以.php结尾的文件进行正则匹配~*表示不区分大小写。rewrite (.) http://www.kgc.com permanent;将符合条件的请求永久重定向到http://www.kgc.com首页。重启 Nginx 服务并测试重定向systemctl restart nginx使用浏览器访问以下链接http://www.kgc.com/upload/123.php请求将被重定向到http://www.kgc.com首页表明 Nginx 已成功匹配并重定向请求。6、基于最普通一条 url 请求的跳转在一些场景中可能需要将访问特定页面的请求重定向到网站的首页。以下是如何在 Nginx 中配置这类 URL 请求跳转的详细步骤。首先打开 Nginx 的主配置文件nginx.conf进行编辑vim /usr/local/nginx/conf/nginx.conf在配置文件中添加如下的server块用于处理对特定 URL 的重定向server { listen 80; server_name www.kgc.com; //设置域名 charset utf-8; access_log /var/log/nginx/www.kgc.com-access.log; //设置访问日志 //配置对 /abc/123.html 页面请求的跳转 location ~* ^/abc/123.html { rewrite (.) http://www.kgc.com permanent; //将匹配的请求永久重定向到首页 } //配置其他请求的处理 location / { root html; index index.html index.htm; } }location ~* ^/abc/123.html该行定义了对具体 URL/abc/123.html进行匹配~*表示不区分大小写。rewrite (.) http://www.kgc.com permanent;将符合条件的请求永久重定向到http://www.kgc.com首页。重启 Nginx 服务并测试重定向systemctl restart nginx使用浏览器访问以下链接http://www.kgc.com/abc/123.html请求将被重定向到http://www.kgc.com首页表明 Nginx 已成功匹配并重定向请求。
Nginx—Rewrite
目录一、Nginx—Rewrite概述1、常用的Nginx正则表达式2、Rewrite功能3、Rewrite跳转实现4、Rewrite执行顺序和语法格式二、location概述1、location分类2、location 常用的匹配规则3、location 优先级案例一案例二案例三案例四案例五案例六案例七案例八案例九三、Nginx 常见网站配置示例3.1、网站根目录匹配规则3.2、静态文件处理规则3.3、动态请求转发规则四、Rewrite 案例1、基于域名的跳转2、基于客户端 IP 访问跳转3、基于旧域名跳转到新域名后面加目录4、基于参数匹配的跳转5、基于目录下所有 php 结尾的文件跳转6、基于最普通一条 url 请求的跳转一、Nginx—Rewrite概述1、常用的Nginx正则表达式^匹配输入字符串的起始位置$匹配输入字符串的结束位置*匹配前面的字符零次或多次匹配前面的字符一次或多次匹配前面的字符零次或一次.匹配除 之外的任何单个字符转义字符使后面的字符被视为普通字符或特殊字符d匹配数字相当于[0-9]{n}匹配前面的字符恰好 n 次{n,}匹配前面的字符至少 n 次{n,m}匹配前面的字符至少 n 次至多 m 次[]定义字符集匹配括号内的任意单个字符[c]匹配单个字符 c[a-z]匹配小写字母中的任意一个[a-zA-Z0-9]匹配所有大小写字母或数字()组括号分组和捕获子表达式2、Rewrite功能①、使用nginx提供的全局变量或自己设置的变量结合正则表达式和标记位实现URL重写以及重定向。比如更换域名后需要保持旧的域名能跳转到新的域名上、某网页发生改变需要跳转到新的页面、网站防盗链等等需求。②、rewrite只能放在server{},location{},if{}中并且默认只能对域名后边的除去传递的参数外的字符串起作用例如http://www.kgc.com/abc/bbs/index.phpa1b2只对/abc/bbs/index.php重写。3、Rewrite跳转实现ngx_http_rewrite_module模块支持 URL 重写和条件判断。通过if指令支持条件判断但不支持else。URL 跳转可以在location块中使用rewrite指令实现从一个location跳转到另一个location。跳转循环最多执行 10 次超过 10 次会导致 Nginx 返回 500 错误。PCRE 支持支持 Perl 兼容正则表达式PCRE语法规则进行匹配。set指令用于创建新的变量并设定其值。4、Rewrite执行顺序和语法格式①、执行顺序执行server块中的rewrite指令在server块中定义的rewrite指令首先被执行用于处理请求。执行location匹配根据请求的 URINginx 会匹配最合适的location块。执行选定的location中的rewrite指令在匹配到的location块中执行该块内定义的rewrite指令。②、语法格式rewrite regex replacement [flag];regex表示用于匹配请求 URL 的正则表达式规则。replacement表示 URL 重写后的目标内容或路径。flag可选用于指定重写的标志影响重写操作的行为。常见标志包括last停止当前location的匹配过程重新选择合适的location。break停止当前location的匹配过程并继续执行当前location中的其他指令。redirect发出一个临时的 302 重定向响应。permanent发出一个永久的 301 重定向响应。二、location概述1、location分类①、精准匹配语法location / {...}说明严格匹配指定的 URI只有当请求的 URI 完全匹配时才会应用该location块中的配置。②、一般匹配语法location / {...}说明前缀匹配请求的 URI 以指定的前缀开头时会匹配该location块。适用于大多数简单的 URI 匹配情况。③、正则匹配语法location ~ /regex {...}说明使用正则表达式进行匹配适用于复杂的 URI 匹配场景。正则匹配会在一般匹配后进行。2、location 常用的匹配规则匹配规则说明示例精确匹配 URIURI 必须完全匹配时才应用location /yudh { … }^~普通字符前缀匹配匹配成功后停止其他 location 匹配location ^~ /images/ { … }~区分大小写的正则表达式匹配location ~ .jpg$ { … }~*不区分大小写的正则表达式匹配location ~* .jPg$ { … }!~区分大小写的正则表达式匹配取非location !~ .jpg$ { … }!~*不区分大小写的正则表达式匹配取非location !~* .jPg$ { … }3、location 优先级首先精确匹配 其次前缀匹配 ^~其次是按文件中顺序的正则匹配或*然后匹配不带任何修饰的前缀匹配 abc最后是交给 / 通用匹配 /案例一****location /http://www.kgc.com/data { # 配置 } location /abc { # 配置 }location /http://www.kgc.com/data它不匹配/data因为location /http://www.kgc.com/data为精确匹配 / 主机名后面不能带任何字符串比如访问 / 和 /data则 / 匹配/data 不匹配。再比如location /abc它只匹配/abc /abc/或 /abcd不匹配。若location/abc则即匹配/abc 或/abcd/ 同时也匹配。案例二location / { # 配置 }比如有以下三个地址http://www.kgc.com/datahttp://www.kgc.com/data/abc/a/usr/local/nginx/html/data/abc因为所有的地址都以 / 开头所以这条规则将匹配到所有请求 比如访问 / 和 /data, 则 / 匹配/data 也匹配。但若后面是正则表达式会和最长字符串优先匹配最长匹配案例三location /documents/ { # 配置 }比如有以下一个地址http://www.kgc.com/documents/abc它匹配任何以 /documents/ 开头的地址匹配符合以后还要继续往下搜索其它 location只有其它 location后面的正则表达式没有匹配到时才会采用这一条。案例四location /documents/abc { # 配置 }匹配任何以 /documents/abc 开头的地址匹配符合以后还要继续往下搜索其它 location只有其它 location后面的正则表达式没有匹配到时才会采用这一条。案例五location ^~ /images/ { # 配置 }匹配任何以 /images/ 开头的地址匹配符合以后停止往下搜索正则采用这一条。案例六location ~* .(gif|jpg|jpeg)$ { # 配置 }匹配所有以 gif、jpg或jpeg 结尾的请求然而所有请求 /images/ 下的图片会被 location ^~ /images/ 处理因为 ^~ 的优先级更高所以到达不了这一条正则。案例七location /images/abc { # 配置 }最长字符匹配到 /images/abc优先级最低继续往下搜索其它 location会发现 ^~ 和 ~ 存在。案例八location ~ /images/abc { # 配置 }匹配以/images/abc 开头的优先级次之只有去掉 location ^~ /images/ 才会采用这一条。案例九location /images/abc/1.html { # 配置 } location ~ /images/abc/1.html { # 配置 }匹配/images/abc/1.html 文件如果和正则location ~ /images/abc/1.html 相比正则优先级更高优先级总结(location 完整路径) (location ^~ 路径) (location ~,~* 正则顺序) (location 部分起始路径) (location /)location 匹配顺序首先看 优先级精确前缀正则一般通用优先级相同正则看上下顺序上面的优先一般匹配看长度最长匹配的优先精确、前缀、正则、一般 都没有匹配到最后再看通用匹配 一般匹配三、Nginx 常见网站配置示例在实际网站的 Nginx 配置中通常至少会定义三个匹配规则以实现高效的请求处理。这些规则包括首页的匹配规则、静态文件的处理规则以及动态请求的转发规则。3.1、网站根目录匹配规则这个规则用于直接匹配网站的根目录/通常用于访问网站首页。因为通过域名访问网站首页的请求较为频繁使用这个规则可以加速处理。首页可以是一个静态页面也可以转发到后端应用服务器。location / { ? ? root html; ? ? index index.html index.htm; }解释当请求 URI 为/时Nginx 会寻找html目录下的index.html或index.htm作为首页响应。如果有必要这个请求也可以被转发到后端服务器进行处理。3.2、静态文件处理规则Nginx 作为 HTTP 服务器处理静态文件请求是其强项。可以通过目录匹配或后缀匹配来处理静态资源请求任选其一或搭配使用。目录匹配匹配以/static/开头的请求将其映射到文件系统的/webroot/static/目录。location ^~ /static/ { ? ? root /webroot/static/; }后缀匹配匹配特定后缀的请求如.html、.gif、.jpg等将这些请求映射到文件系统的/webroot/res/目录。location ~* .(html|gif|jpg|jpeg|png|css|js|ico)$ { ? ? root /webroot/res/; }解释目录匹配主要用于静态资源的路径匹配后缀匹配则用于对特定类型文件的请求匹配。根据实际需求可以选择一种或两种方式组合使用。3.3、动态请求转发规则对于非静态文件的请求通常会默认认为是动态请求这类请求需要转发到后端应用服务器进行处理。例如将带有.php或.jsp后缀的请求转发给 Tomcat 等后端服务器。location / { ? ? proxy_pass http://tomcat_server; }解释这个通用规则将所有未匹配到前面规则的请求即大多数动态请求转发到后端应用服务器http://tomcat_server进行处理。四、Rewrite 案例1、基于域名的跳转在某些情况下可能需要将旧域名的所有请求重定向到新域名并且保持 URL 中的参数不变。以下是一个 Nginx 配置示例用于将旧域名www.kgc.com的请求永久重定向到新域名。编辑 Nginx 配置文件vim /usr/local/nginx/conf/nginx.conf设置 Nginx 服务器块server { listen 80; server_name www.kgc.com; //旧域名 charset utf-8; access_log /var/log/nginx/www.kgc.com-access.log; //设置访问日志 location / { //添加域名重定向逻辑// if ($host www.kgc.com) { //$host 变量表示请求的主机名 rewrite ^/(.*)$ http://www.benet.com/$1 permanent; //将旧域名的请求重定向到新域名保持参数不变 } root html; index index.html index.htm; } }更新/etc/hosts文件echo 172.16.88.22 www.kgc.com www.benet.com /etc/hosts重启 Nginx 服务并测试systemctl reload nginx在浏览器中访问旧域名如http://www.kgc.com/test/1.html你将会看到页面自动跳转到http://www.benet.com/test/1.html并且浏览器的开发者工具中会显示返回的 301 状态码表示实现了永久重定向。2、基于客户端 IP 访问跳转在某些情况下可能需要根据客户端的 IP 地址来控制对网站的访问。例如新的业务版本上线期间所有的访问都需要跳转到维护页面只有特定的公司 IP 地址可以正常访问网站。以下是 Nginx 的配置示例用于实现这个需求。首先打开 Nginx 的主配置文件nginx.conf并进行编辑vim /usr/local/nginx/conf/nginx.conf在配置文件中添加如下的server块配置用于处理旧域名的请求并将其重定向到新域名。server { listen 80; server_name www.kgc.com; //设置域名 charset utf-8; access_log /var/log/nginx/www.kgc.com-access.log; //设置访问日志 //设置 IP 访问控制变量 set $rewrite true; //默认所有 IP 需要重定向到维护页面 # 判断是否为合法 IP 地址 if ($remote_addr 172.16.88.22) { //如果客户端 IP 为 172.16.88.22 set $rewrite false; //不进行重写允许正常访问 } //对于非法 IP 地址进行重写跳转 if ($rewrite true) { //如果变量 $rewrite 仍为 true rewrite (.) /weihu.html; //重定向到维护页面 } //配置维护页面的 location location /weihu.html { root /var/www/html; //设置维护页面文件所在目录 } //配置正常访问的 location location / { root html; //设置正常网站的根目录 index index.html index.htm; } }在/var/www/html/目录下创建一个简单的维护页面mkdir -p /var/www/html/ echo h1We are maintaining now!/h1 /var/www/html/weihu.html重启 Nginx 服务并测试systemctl restart nginx访问网站时只有 IP 为 172.16.88.22的用户 能够正常访问网站的内容。其他所有 IP 的访问请求都会被重定向到/weihu.html维护页面并显示维护信息We are maintaining now!。3、基于旧域名跳转到新域名后面加目录当旧域名需要重定向到新域名的特定路径时可以使用 Nginx 的rewrite指令进行配置。以下是如何将旧域名http://bbs.kgc.com/post/下的所有请求跳转到新域名。打开 Nginx 的主配置文件nginx.conf并进行编辑vim /usr/local/nginx/conf/nginx.conf在配置文件中添加如下的server块配置用于处理旧域名的重定向server { listen 80; server_name bbs.kgc.com; //旧域名 charset utf-8; access_log /var/log/nginx/www.kgc.com-access.log; //设置访问日志 //设置旧域名下 /post 的重定向规则 location /post { rewrite ^/post(.*)$ http://www.kgc.com/bbs/post$1 permanent; //进行永久重定向 } //配置其他请求的处理 location / { root html; index index.html index.htm; } }在新域名的对应路径下创建一个测试文件mkdir -p /usr/local/nginx/html/bbs/post echo this is 1.html /usr/local/nginx/html/bbs/post/1.html修改本地hosts文件为了在本地测试将旧域名映射到本地服务器的 IP 地址echo 172.16.88.22 bbs.kgc.com /etc/hosts重启 Nginx 服务并测试systemctl restart nginx在浏览器中访问http://bbs.kgc.com/post/1.html。你应该会被重定向到http://www.kgc.com/bbs/post/1.html。这表明重定向规则已经成功应用并且旧域名的请求被正确地转发到了新域名下的相应路径。4、基于参数匹配的跳转在实际应用中有时需要根据特定的 URL 参数模式将用户请求重定向到其他页面。下面是如何使用 Nginx 的rewrite指令实现这样的需求将访问http://www.kgc.com/100-(100|200)-100.html的请求重定向到http://www.kgc.com首页。打开 Nginx 的主配置文件nginx.conf并进行编辑vim /usr/local/nginx/conf/nginx.conf在配置文件中添加如下的server块配置用于处理基于参数匹配的跳转server { listen 80; server_name www.kgc.com; //域名设置 charset utf-8; access_log /var/log/nginx/www.kgc.com-access.log; //设置访问日志 # 设置基于参数匹配的跳转规则 if ($request_uri ~ ^/100-(100|200)-(d).html$) { rewrite (.) http://www.kgc.com permanent; //重定向到首页 } # 配置其他请求的处理 location / { root html; index index.html index.htm; } }$request_uri表示包含请求参数的原始 URI不包含主机名。if ($request_uri ~ ^/100-(100|200)-(d).html$)匹配 URL 中符合100-100-100.html或100-200-100.html模式的请求。rewrite (.) http://www.kgc.com permanent;将符合条件的请求永久重定向到http://www.kgc.com首页。重启 Nginx 服务并测试systemctl restart nginx使用浏览器访问以下链接http://www.kgc.com/100-100-100.htmlhttp://www.kgc.com/100-200-100.html两者均应被重定向到http://www.kgc.com首页表明 Nginx 已成功匹配并重定向请求。Nginx 相关变量解释$request_uri包含原始请求 URI 和参数如/abc/bbs/index.html?a1b2。$uri仅包含请求的路径部分不包含参数如/abc/bbs/index.html。**d o c u m e n t _ u r i ∗ ∗ 与 ‘ document\_uri**与 document_uri∗∗与‘uri 相同表示当前请求的路径部分不包含参数。5、基于目录下所有 php 结尾的文件跳转在某些情况下可能需要将访问特定目录下所有以.php结尾的文件请求重定向到网站首页。以下是如何在 Nginx 中配置这类跳转的详细步骤。首先打开 Nginx 的主配置文件nginx.conf进行编辑vim /usr/local/nginx/conf/nginx.conf在配置文件中添加如下的server块用于处理对特定目录下.php文件的重定向server { listen 80; server_name www.kgc.com; # 设置域名 charset utf-8; access_log /var/log/nginx/www.kgc.com-access.log; # 设置访问日志 # 配置对 /upload/ 目录下所有 .php 文件的跳转 location ~* /upload/.*.php$ { rewrite (.) http://www.kgc.com permanent; # 将匹配的请求永久重定向到首页 } # 配置其他请求的处理 location / { root html; index index.html index.htm; } }location ~* /upload/.*.php$该行定义了对/upload/目录下所有以.php结尾的文件进行正则匹配~*表示不区分大小写。rewrite (.) http://www.kgc.com permanent;将符合条件的请求永久重定向到http://www.kgc.com首页。重启 Nginx 服务并测试重定向systemctl restart nginx使用浏览器访问以下链接http://www.kgc.com/upload/123.php请求将被重定向到http://www.kgc.com首页表明 Nginx 已成功匹配并重定向请求。6、基于最普通一条 url 请求的跳转在一些场景中可能需要将访问特定页面的请求重定向到网站的首页。以下是如何在 Nginx 中配置这类 URL 请求跳转的详细步骤。首先打开 Nginx 的主配置文件nginx.conf进行编辑vim /usr/local/nginx/conf/nginx.conf在配置文件中添加如下的server块用于处理对特定 URL 的重定向server { listen 80; server_name www.kgc.com; //设置域名 charset utf-8; access_log /var/log/nginx/www.kgc.com-access.log; //设置访问日志 //配置对 /abc/123.html 页面请求的跳转 location ~* ^/abc/123.html { rewrite (.) http://www.kgc.com permanent; //将匹配的请求永久重定向到首页 } //配置其他请求的处理 location / { root html; index index.html index.htm; } }location ~* ^/abc/123.html该行定义了对具体 URL/abc/123.html进行匹配~*表示不区分大小写。rewrite (.) http://www.kgc.com permanent;将符合条件的请求永久重定向到http://www.kgc.com首页。重启 Nginx 服务并测试重定向systemctl restart nginx使用浏览器访问以下链接http://www.kgc.com/abc/123.html请求将被重定向到http://www.kgc.com首页表明 Nginx 已成功匹配并重定向请求。