Nginx之URL重写
1.URL重写模块(Rewrite)
摘要
这个模块允许使用正则表达式重写URI(需PCRE库),并且可以根据相关变量重定向和选择不同的配置。如果这个指令在server字段中指定,那么将在被请求的location确定之前执行,如果在指令执行后所选择的location中有其他的重写规则,那么它们也被执行。如果在location中执行这个指令产生了新的URI,那么location又一次确定了新的URI。这样的循环可以最多执行10次,超过以后nginx将返回500错误。
指令
break
语法:break
默认值:none
使用字段:server, location, if
完成当前设置的规则,停止执行其他的重写指令。
示例:
1
2
3
4
|
if ($slow) {
limit_rate 10k;
break ;
}
|
if
一个变量的名称;不成立的值为:空字符传”“或者一些用“0”开始的字符串。
一个使用=或者!=运算符的比较语句。
使用符号~*和~模式匹配的正则表达式:
~为区分大小写的匹配。
~*不区分大小写的匹配(firefox匹配FireFox)。
!~和!~*意为“不匹配的”。
使用-f和!-f检查一个文件是否存在。
使用-d和!-d检查一个目录是否存在。
使用-e和!-e检查一个文件,目录或者软链接是否存在。
使用-x和!-x检查一个文件是否为可执行文件。
正则表达式的一部分可以用圆括号,方便之后按照顺序用$1-$9来引用。
示例配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /msie/ $1 break ;
}
if ($http_cookie ~* "id=([^;] +)(?:;|$)" ) {
set $ id $1;
}
if ($request_method = POST ) {
return 405;
}
if (!-f $request_filename) {
break ;
proxy_pass http: //127 .0.0.1;
}
if ($slow) {
limit_rate 10k;
}
if ($invalid_referer) {
return 403;
}
if ($args ~ post=140){
rewrite ^ http: //example .com/ permanent;
}
|
内置变量$invalid_referer用指令valid_referers指定。
return
rewrite
last - 完成重写指令,之后搜索相应的URI或location。
break - 完成重写指令。
redirect - 返回302临时重定向,如果替换字段用http://开头则被使用。
permanent - 返回301永久重定向。
注意如果一个重定向是相对的(没有主机名部分),nginx将在重定向的过程中使用匹配server_name指令的“Host”头或者server_name指令指定的第一个名称,如果头不匹配或不存在,如果没有设置server_name,将使用本地主机名,如果你总是想让nginx使用“Host”头,可以在server_name使用“*”通配符(查看http核心模块中的server_name)。例如:
1
2
3
|
rewrite ^( /download/ .*) /media/ (.*)\..*$ $1 /mp3/ $2.mp3 last;
rewrite ^( /download/ .*) /audio/ (.*)\..*$ $1 /mp3/ $2.ra last;
return 403;
|
但是如果我们将其放入一个名为/download/的location中,则需要将last标记改为break,否则nginx将执行10次循环并返回500错误。
1
2
3
4
5
|
location /download/ {
rewrite ^( /download/ .*) /media/ (.*)\..*$ $1 /mp3/ $2.mp3 break ;
rewrite ^( /download/ .*) /audio/ (.*)\..*$ $1 /mp3/ $2.ra break ;
return 403;
}
|
如果替换字段中包含参数,那么其余的请求参数将附加到后面,为了防止附加,可以在最后一个字符后面跟一个问号:
1
|
rewrite ^ /users/ (.*)$ /show ?user=$1? last;
|
注意:大括号({和}),可以同时用在正则表达式和配置块中,为了防止冲突,正则表达式使用大括号需要用双引号(或者单引号)。例如要重写以下的URL:
1
|
/photos/123456
|
为:
1
|
/path/to/photos/12/1234/123456 .png
|
则使用以下正则表达式(注意引号):
1
|
rewrite "/photos/([0-9] {2})([0-9] {2})([0-9] {2})" /path/to/photos/ $1/$1$2/$1$2$3.png;
|
如果指定一个“?”在重写的结尾,Nginx将丢弃请求中的参数,即变量$args,当使用$request_uri或$uri&$args时可以在rewrite结尾使用“?”以避免nginx处理两次参数串。
在rewrite中使用$request_uri将www.example.com重写到example.com:
1
2
3
4
|
server {
server_name www.example.com;
rewrite ^ http: //example .com$request_uri? permanent;
}
|
同样,重写只对路径进行操作,而不是参数,如果要重写一个带参数的URL,可以使用以下代替:
1
2
3
|
if ($args ^~ post=100){
rewrite ^ http: //example .com /new-address .html? permanent;
}
|
注意$args变量不会被编译,与location过程中的URI不同(参考http核心模块中的location)。
rewrite_log
set
uninitialized_variable_warn
1
2
3
4
5
6
7
8
|
location /download/ {
if ($forbidden) {
return 403;
}
if ($slow) {
limit_rate 10k;
}
rewrite ^/(download/.*) /media/ (.*)\..*$ /$1 /mp3/ $2.mp3 break ;
|
将被编译成以下顺序:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
variable $forbidden
checking to zero
recovery 403
completion of entire code
variable $slow
checking to zero
checkings of regular excodession
copying "/"
copying $1
copying "/mp3/"
copying $2
copying ".mp3"
completion of regular excodession
completion of entire sequence
|
注意并没有关于limit_rate的代码,因为它没有提及ngx_http_rewrite_module模块,“if”块可以类似”location”指令在配置文件的相同部分同时存在。
如果$slow为真,对应的if块将生效,在这个配置中limit_rate的值为10k。
指令:
1
|
rewrite ^/(download/.*) /media/ (.*)\..*$ /$1 /mp3/ $2.mp3 break ;
|
如果我们将第一个斜杠括入圆括号,则可以减少执行顺序:
1
|
rewrite ^( /download/ .*) /media/ (.*)\..*$ $1 /mp3/ $2.mp3 break ;
|
之后的顺序类似如下:
1
2
3
4
5
6
7
|
checking regular excodession
copying $1
copying "/mp3/"
copying $2
copying ".mp3"
completion of regular excodession
completion of entire code
|
2.简单案例
注,由于配置文件内容较多,为了让大家看着方便,我们备份一下配置文件,打开一个新的配置文件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
[root@nginx ~] # cd /etc/nginx/
[root@nginx nginx] # mv nginx.conf nginx.conf.proxy
[root@nginx nginx] # cp nginx.conf.bak nginx.conf
[root@nginx nginx] # vim /etc/nginx/nginx.conf
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
rewrite ^ /bbs/ (.*)$ http: //192 .168.18.201 /forum/ $1;
}
}
|
准备forum目录与测试文件
1
2
3
4
5
6
7
|
[root@web1 ~] # cd /var/www/html/
[root@web1 html] # ls
index.html
[root@web1 html] # mkdir forum
[root@web1 html] # cd forum/
[root@web1 forum] # vim index.html
<h1>forum page!< /h1 >
|
测试一下
好了,下面我们来测试一下rewrite重写。
3.重新加载一下配置文件
1
2
3
4
|
[root@nginx 63] # service nginx reload
nginx: the configuration file /etc/nginx/nginx .conf syntax is ok
nginx: configuration file /etc/nginx/nginx .conf test is successful
重新载入 nginx: [确定]
|
4.测试一下
注,大家可以从图中看出,status code 302指的是临时重定向,那就说明我们rewrite重写配置成功。大家知道302是临时重定向而301是永久重定向,那么怎么实现永久重定向呢。一般服务器与服务器之间是临时重定向,服务器内部是永久重定向。下面我们来演示一下永久重定向。
5.配置永久重定向
1
2
3
4
5
6
7
8
9
10
11
12
|
[root@nginx nginx] # vim /etc/nginx/nginx.conf
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
rewrite ^ /bbs/ (.*)$ /forum/ $1;
}
}
|
准备forum目录与测试文件
1
2
3
4
5
6
7
|
[root@nginx ~] # cd /usr/html/
[root@nginx html] # ls
50x.html index.html
[root@nginx html] # mkdir forum
[root@nginx html] # cd forum/
[root@nginx forum] # vim index.html
<h1>192.168.18.208 forum page< /h1 >
|
6.重新加载一下配置文件
1
2
3
4
|
[root@nginx ~] # service nginx reload
nginx: the configuration file /etc/nginx/nginx .conf syntax is ok
nginx: configuration file /etc/nginx/nginx .conf test is successful
重新载入 nginx: [确定]
|
7.测试一下
注,大家从图中可以看到,我们访问bbs/是直接帮我们跳转到forum/下,这种本机的跳转就是永久重定向也叫隐式重定向。好了,rewrite重定向我们就说到这里了,想要查询更多关于重定向的指令请参考官方文档。最后,我们来说一下读写分离。
Nginx之URL重写相关推荐
- Cento7+Nginx 之 URL重写
Cento7+Nginx 之 URL重写 我们前一篇文章写了一个Cento7+Nginx 反向代理实现多域名跳转,今天主要介绍一下Cento7+Nginx 之 URL重写, Hostname: ...
- Nginx实现URL重写
本文利用Nginx实现URL重写,本文使用Nginx与静态页面配合重写URL. 1.准备工作. 结合本文场景,需要安装Nginx. 1.1 关于Linux系统安装Nginx可以参考我的文章---(传送 ...
- nginx配置url重写
url重写是指通过配置conf文件,以让网站的url中达到某种状态时则定向/跳转到某个规则,比如常见的伪静态.301重定向.浏览器定向等 rewrite 语法 在配置文件的server块中写,如: s ...
- nginx的url重写[rewrite规则和参考]
本日志内容来自互联网和平日使用经验,整理一下方便日后参考. Nginx Rewrite 相关指令有 if.rewrite.set.return 等. if 的语法 应用于 server 和 locat ...
- Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解(1)
大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Nginx之页面缓存 七.Nginx之URL重写 八.Nginx之读写分离 注,操作系统 ...
- Nginx 反向代理、负载均衡、页面缓存、URL重写、读写分离及简单双机热备详解...
大纲 一.前言 二.环境准备 三.安装与配置Nginx (windows下nginx安装.配置与使用) 四.Nginx之反向代理 五.Nginx之负载均衡 (负载均衡算法:nginx负载算法 up ...
- Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解
标签:读写分离 页面缓存 URL重写 Nginx 反向代理 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://freeloda.bl ...
- Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解【转载】
本文只为备份,以防失效.原文请看https://blog.51cto.com/freeloda/1288553 补充说明:部分图片为测试图片,未完全复制,参考文字描述即可. Nginx 反向代理.负载 ...
- Nginx反向代理、负载均衡、页面缓存、URL重写及读写分离详解
大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Nginx之页面缓存 七.Nginx之URL重写 八.Nginx之读写分离 注,操作系统 ...
最新文章
- python自学网课-python网课学习笔记--4
- redis服务器端和客户端启动
- mysql配置环境变量(win 10)_mysql配置环境变量(win 10)
- 外键约束 mysql
- python无法导入模块_python怎么导入模块
- empty 与 remove 的区别
- Bloomberg监控系统的标准化和扩展
- 关于LINUX的NVIDIA显卡驱动安装
- jstack命令报错
- IDM的Google商店插件
- CentOS官网 安装包下载
- 关于keras.sum()和kears.softmax()等函数中维度的理解
- 数据结构(六)散列查找 —— 编程作业01 :电话聊天狂人
- R语言ggplot2可视化:使用patchwork包将两个ggplot2可视化结果组合起来、使用labs函数为第两个子图都添加标题信息(subtitle for each subplots)
- SKY66111-11低功耗蓝牙芯片
- gxcvvvvvvvvvvvvvvvvvvv
- ValueError: module functions cannot set METH_CLASS or METH_STATIC 的快速处理方法
- 虚拟机命令里面的光标不动了怎么办_Linux 中实用但很小众的 11 个炫酷终端命令...
- java bigpipe_BigPipe的正确使用姿势
- 6-斯坦福大学自然语言处理第四课“语言模型(Language Modeling)
热门文章
- jzyz 1225 调查干草
- 宠物行业新锐宠胖胖APP联手麻花特开心正式出道
- 学校计算机教室张贴些,计算机教室墙面布置方法是什么?
- 红米note5手机插u盘没反应_U盘插到充电器上会损坏?爆炸?实验结果没让我失望...
- CTF密码学总结(一)
- 股票市场量化分析matlab,(特价书)MATLAB金融算法分析实战:基于机器学习的股票量化分析...
- unity2019安装完后打不开直接闪退_VS2019打不开或没反应该怎么解决?
- 鸿蒙系统打王者荣耀卡不卡,鸿蒙系统会不会越用越卡?鸿蒙系统会影响王者荣耀吗?...
- python列表中的字典如何添加键值对_在Python中将键值对添加到字典中
- 答:本科生写论文对考研有用吗?