【Nginx】Nginx的重定向——location

location        匹配URI

location        匹配的规则和优先级;***重点

nginx常用的变量;要求掌握

rewrite        重定向;掌握/理解

location匹配:***

正则表达式:匹配的是文件内容

常见的正则表达式:
.    匹配任意单个字符,包括汉字
^    起始位置
$    结束位置
*    匹配前面的字符0次或者多次
+    匹配前面的字符1次或者多次
?    匹配前面的字符1次或者0次
\    转义符;\.==.;

\d     匹配纯数字
[a-zA-Z0-9]    匹配所有大小写字符或者任意数字
[a]    匹配单个字符a
{n}    连续重复出现几次
{m,n}  最少出现m次,最多出现n次
()     分组
|      逻辑或

URI:统一资源标识符,是一种字符串标识,用于表示抽象的或者物理资源(文件、图片、视频)

location就是来匹配URI的

1.精确匹配:location= / {...}
2.正则匹配:location~ / {...}
3.通用匹配:location / {...}

匹配规则:

=     精确匹配;完全匹配,必须完全一致
^~    匹配普通字符,前缀匹配
~     区分大小写的匹配
~*    不区分大小写的匹配
~$    结束位置
!~    取反;区分大小写,取得逻辑非;
!~*   取反;不区分大小写

location的匹配原则:越精确,优先级越高

匹配的优先级:

精确匹配 > 正则匹配 > 通用匹配

location = > location ^~ > location ~* > location /test > location /

配置文件的修改:

vim /usr/local/nginx/conf/nginx.conf

修改后:
nginx -t        #查看语法是否有问题
systemctl restart nginx    #重启nginx服务

生产中location的匹配规则

1.第一个必选规则
location = /

直接匹配根网站,通过域名访问网站首页是最多的;使用精确匹配,可以加快处理速度

2.第二个规则
location ^~ /static/ {}

处理静态文件的请求,目录匹配

3.
location ~* \.(gif|jpg|png|css) {...}    #匹配图片用的
4.通用规则
location / {
proxy_pass	指定代理,反向代理,转发动态请求;将.php .jsp的请求发送到后端

}

location /test/ {			#指定匹配

}

rewrite        重写,重定向

作用:

rewrite使用nginx的全局变量或者是自己设置的变量,结合正则表达式和标志位实现URL的重写,以及重定向

rewrite只能放在server{},location{},if{}中,并且默认只能对域名后边的除去传递的参数外的字符串起作用

例:
http://www.kgc.com/a/we/index.php?id=1&u=str     #只对/a/we/index.php重写。

rewrite执行的顺序:

1.先执行server块当中的rewrite

2.执行location匹配

3.如果location当中还有rewrite,继续执行

不停rewrite,死循环,只能10次,然后报错,状态码:500

rewrite的语法:

rewrite <regex> <replacemnet> [flag]
rewrite    开始重定向
regex      正则匹配的规则
replacemnet    表示跳转后的内容,你要重定向的url
flag       标志位;表示rewrite支持的flag标记

permanent    永久重定向;返回码:301
redirect     临时重定向;返回码:302
永久重定向,301;永久性的变更URL,搜索引擎会转移他的权重以及排名到新的URL
临时重定向,302;用于短期变更(例:网站维护,或者升级更新),搜索引擎不会转移权重和排名到新的URL
304  表示获取的是本地的缓存

flag标记说明

last         本条规则匹配完成后,继续向下匹配新的location URI规则。
break        本条规则匹配完成即终止,不再匹配后面的任何规则,且URI不会发生变化。
redirect     返回302临时重定向,浏览器地址会显示跳转后的URL地址。
permanent    返回301永久重定向,浏览器地址栏会显示跳转后的URL地址。
例:
permanent:
location / {

        rewrite /test/(.*) /ky30/$1 permanent;
        index index.html index.htm;

        }
		
mkdir test 
echo test > index.html
mkdir ky30
echo ky30 > index.html
返回301,永久重定向

break的作用

是重定向,但是不会改变URI,而且只会请求一次;跳出当前匹配,立即终止

last

本条负责匹配完成后,继续向下匹配,只要有last就继续匹配;配置的时候需要注意,防止进入死循环

死循环的报错:rewrite or internal redirection cycle while processing #写成死循环,一直在匹配location;循环10次后终止,返回码500.

基于域名的跳转

现在公司旧域名www.kgc.com有业务需求变更,需要使用新域名www.benet.com代替,但是旧域名不能废除,
需要跳转到新域名上,而且后面的参数保持不变。

vim /usr/local/nginx/conf/nginx.conf
server {
    listen       80;
    server_name  www.kgc.com;                                       #域名修改    
    #charset utf-8;
    #access_log  /var/log/nginx/kgc.com-access.log;                  #日志修改
    location / {
    #添加域名重定向
        if ($host = 'www.kgc.com'){                                #$host为rewrite全局变量,代表请求主机头字段或主机名
            rewrite ^/(.*)$ http://www.benet.com/$1 permanent;       #在重定向时,$1表示请求的URL
        }
        root   html;
        index  index.html index.htm;
    }
}


echo "192.168.220.10 www.kgc.com www.benet.com" >> /etc/hosts
systemctl restart nginx

permanent: 永久性重定向,请求日志中的状态码为301。

基于IP地址的跳转:页面维护、升级

今天公司业务新版本上线,要求所有 IP 访问任何内容都显示一个固定维护页面,
只有公司 IP :192.168.220.10访问正常。

vim /usr/local/nginx/conf/nginx.conf
server {
	listen       80;
	server_name  www.kgc.com;                       #域名修改	
	charset utf-8;
	access_log  /var/log/nginx/kgc.com-access.log;  #日志修改

	#设置是否合法的IP标记
    set $rewrite true;                             #设置变量$rewrite,变量值为boole值true
	
    #判断是否为合法IP
	if ($remote_addr = "192.168.220.10"){          #当客户端IP为192.168.220.10时,将变量值设为false,不进行重写
        set $rewrite false;
    }
	                                               #除了合法IP,其它都是非法IP,进行重写跳转维护页面
    if ($rewrite = true){                          #当变量值为true时,进行重写
        rewrite (.+) /error.html;                   #重写在访问IP后边插入/error.html,例如192.168.220.22/error.html
    }
    location = /error.html {
        root html;                                 #网页返回html/error.html的内容
    }
	
	location / {
        root   html;
        index  index.html index.htm;
    }
}


systemctl restart nginx

#只有 IP 为 192.168.220.10 能正常访问,其它地址都是维护页面

systemctl restart nginx.service 
基于目录下所有 php 结尾的文件跳转
vim /usr/local/nginx/conf/nginx.conf
server {
    listen       80;
    server_name  www.test.com;        #域名修改    
    charset utf-8;
    access_log  /var/log/nginx/www.test.com-access.log;
    
    location ~* /upload/.*\.php$ {
        rewrite (.+) http://www.test.com permanent;
    }
 
    location / {
        root   html;
        index  index.html index.htm;
    }
}
systemctl restart nginx

访问http://www.test.com/upload/123.php,直接跳转到www.test.com

Nginx的内置变量:

$uri
$remote_addr    客户端的IP地址
$remote_port    客户端的端口号
$server_addr    服务器的IP地址
$server_port    服务器的端口号。表示如果没有在其他地方显示设置,content-type的字段,默认响应为text/plan;纯文本格式
text/html       默认的响应类型,也就是我们说的页面

<think>嗯,用户想了解Nginx的URL重定向,我得先理清楚这个主题的关键点。首先,我应该从基本概念开始,解释什么是URL重定向,为什么需要它。然后,可能需要介绍常见的重定向类型,比如301和302的区别,用户可能不太清楚这些状态码的意义。 接下来,用户可能需要具体的配置方法。我应该涵盖几种常见的重定向场景,比如整个站点的重定向、特定路径的重定向、HTTPS强制跳转,还有带参数的重定向处理。每个场景给出示例配置,这样用户可以直接参考使用。 另外,用户可能会遇到需要正则表达式的情况,这部分需要详细说明,比如如何捕获分组并在重定向中使用。还要注意语法是否正确,比如Nginx中if语句的使用限制,避免常见的配置错误。 可能还需要提到一些高级技巧,比如根据请求方法或参数进行条件重定向,但得确认这些是否是用户需要的。不过作为基础介绍,可能先覆盖常见的情况更合适。 最后,要确保回答结构清晰,分步骤说明,让用户能逐步理解和应用。同时,提醒用户测试配置的重要性,避免上线后出现问题。可能还需要强调检查语法和重启Nginx服务的步骤,帮助用户避免常见陷阱。</think>好的,我将分步骤为您介绍Nginx的URL重定向实现方法: 一、重定向基础概念 URL重定向(URL Redirection)是将一个URL请求自动转向到另一个URL的技术,常见场景包括: 1. 网站改版后的旧链接跳转 2. HTTP强制跳转HTTPS 3. 域名变更 4. 路径规范化(如统一尾部斜杠) 二、Nginx配置重定向的核心指令 ```nginx return 状态码 目标URL; rewrite 正则表达式 替换目标 [flag]; ``` 三、常见重定向场景实现 1. 全站HTTP跳转HTTPS(301永久重定向) ```nginx server { listen 80; server_name example.com; return 301 https://$host$request_uri; } ``` 2. 特定路径重定向 将 `/old-page` 重定向到 `/new-page`: ```nginx location = /old-page { return 301 https://example.com/new-page; } ``` 3. 带参数重定向 保留请求参数的跳转: ```nginx location /search { return 301 https://search.example.com$request_uri; } ``` 4. 正则表达式重定向 ```nginx # 匹配数字路径跳转 rewrite ^/item/(\d+)$ /products/$1 permanent; # 尾部斜杠规范化 rewrite ^/(.*)/$ /$1 permanent; ``` 四、高级应用技巧 1. 条件判断重定向 ```nginx if ($http_user_agent ~* "bot") { rewrite ^/(.*)$ /bot-page/$1 redirect; } ``` 2. 多域名统一跳转 ```nginx server { listen 80; server_name example.net www.example.org; return 301 https://example.com$request_uri; } ``` 五、注意事项 1. 状态码选择: - 301(永久重定向):SEO友好,浏览器会缓存 - 302(临时重定向):不缓存,用于测试环境 2. 正则表达式优先级: - `=` 精确匹配 > `^~` 前缀匹配 > 正则匹配 > 通用匹配 3. 建议测试顺序: ```bash nginx -t # 检查配置语法 systemctl reload nginx # 平滑重载配置 ``` 六、调试技巧 使用curl验证响应头: ```bash curl -I http://example.com/old-path ``` 预期输出应包含: ``` HTTP/1.1 301 Moved Permanently Location: https://example.com/new-path ``` 实际应用时,请根据具体需求调整正则表达式和跳转逻辑。如果遇到特定场景的重定向需求,可以提供详细信息,我可以给出针对性配置建议。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值