本文主要介绍Nginx常用的重写规则。nginx的重写功能是利用nginx提供的全局变量或者自己设置的变量,结合正则表达式和标志位,对URL进行重写和重定向。有兴趣的可以一起了解一下。
本文提供了一些常用的重写规则来美化网页的链接。如果你不知道如何得到规则中的$1$2,只要记住第一个()是$1,第二个()是$2。
请求的网址是给人看的,重写的网址是给电脑看的。
执行搜索
此规则的目的是搜索URL中包含的关键字。
请求的网址//hqidi . com/search/some-search-keywords
重写网址//hqidi.com/search.php?p=一些搜索关键词
重写规则rewrite/search/(。*) $/search.php?p=$1?
用户个人资料页面
大多数运行访问者注册的动态网站都提供了一个页面,您可以在其中查看个人数据。该页面的URL包含用户的UID和用户名。
请求的网址//hqidi.com/user/47/dige
重写网址//hqidi.com/user.php?id=47name=dige
重写规则rewrite/user/([0-9])/(。)$/user.php?id=$1name=$2?
多个参数
一些网站对字符串参数使用不同的语法,例如用斜杠“/”分隔未命名的参数
请求的URL//hqidi . com/index . PHP/param 1/param 2/param 3
重写网址//hqidi.com/index.php?p1=param1p2=param2p3=param3
重写规则rewrite/index.php/(。*)/(.*)/(.*) $/index.php?p1=$1p2=$2p3=$3?
类似百科的格式
这种格式的特点是前缀目录后跟文章名称。
请求的URL//hqidi . com/wiki/Some-keywords
重写网址//hqidi.com/wiki/index.php?title=一些-关键字
重写规则rewrite/wiki/(。*) $/wiki/index.php?title=$1?
论坛
一般论坛用两个参数,一个话题,一个发帖。
请求的网址//hqidi . com/topic-1234-50-some-keywords . html
重写网址//hqidi.com/viewtopic.php?主题=1234开始=50
重写规则重写/主题-([0-9])-([0-9])-(。*) \.html $ viewtopic.php?topic=$1start=$2?
新网站的文章
这个URL结构的特征是一个文章标识符,后跟一个斜杠和一个关键字列表。
请求的网址//hqidi.com/88/future
重写网址//hqidi.com/atricle.php?id=88
重写规则rewrite/([0-9])/。* $/article . PHP?id=$1?
最后一个问号
如果替换的URI包含参数(比如/app/test.php?URI如id=5),默认情况下,该参数会自动附加到替换字符串上,这可以通过添加?马克解决了这个问题。
重写^/users/(.*)$ /show?user=$1?最后;
对比一加?标而不加?标记的URL跳转差异:
重写^/test(.*)$//hqidi . com/home pre manent;
去//hqidi.com/test?id=5 301跳转后的URL地址是//hqidi.com/home?id=5
重写^/test(.*)$ //hqidi.com/home?持久的;
去//hqidi.com/test?id=5 301跳转后的网址是//hqidi.com/home
Nginx的重写功能需要PCRE软件的支持,即通过perl兼容的正则表达式语句匹配规则。参数编译nginx默认会支持重写模块,但也必须PCRE支持。
重写是实现URL重写的关键指令。根据regex(正则表达式)部分,重定向到替换,标志在末尾。
nginx rewrite指令执行顺序
1.执行服务器块的重写指令(这里的块是指server关键字后用{}包围的区域,类似于其他xx块)
2.执行位置匹配
3.在所选位置执行重写命令
如果一个步骤的URI被重写,再次执行1-3,直到找到真正的文件。
如果循环次数超过10次,则返回500内部服务器错误错误。
标志位
重写的语法很简单,比如:
重写正则表达式URL[标志];
Rewrite是关键字,regex是正则表达式,URL是要替换的内容,[flag]是标志位的意思。它具有以下值:
Last:相当于Apache的[L]标记,表示重写完成。
Break:停止执行当前虚拟主机的后续重写指令集。
重定向:返回302临时重定向,跳转后地址栏会显示地址。
永久:返回301永久重定向,地址栏会显示跳转后的地址。
因为301和302不能简单的只返回状态码,还必须有重定向的URL,这也是返回指令不能返回301,302的原因。这里last和break的区别有点难以理解:
Last一般写在server和if,而break一般用在location。
Last不终止重写后的url匹配,即新的url将从服务器再次经历匹配过程,break终止重写后的匹配。
并且break last可以组织继续执行下面的重写指令。
看一个简单的例子:
重写^/listings/(.*)$ /listing.html?listing=$ 1 last
重写^/images/(.*)_(\d )x(\d )\。(png|jpg|gif)$ /resizer/$1。$4?宽度=$ 2高度=$3?最后;
在第一个重写规则中,我们可以使用友好的URL:http://mysite.com/listings/123而不是http://mysite.com/listing.html?清单=123,这意味着我们在浏览器的地址栏输入http://mysite.com/listings/123后,实际访问的URL资源是http://mysite.com/listing.html?清单=123。
在第二个规则中,对形状像http://mysite.com/images/bla_500x400.jpg的文档的请求被重写为http://mysite.com/resizer/bla.jpg?宽度=500高度=400地址,并将继续尝试匹配位置。
If指令和全局变量
if指令的语法是if(condition){.},判断给定的条件。如果为真,将执行花括号中的重写指令。
看看代码规则:
if ($http_user_agent ~ MSIE) {
重写^(.*)$/msie/$ 1 break;
}//如果UA包含“MSIE”,则将请求重写到/msid/目录
if($ http _ cookie ~ * 'id=([^;] )(?|$)') {
设置$ id $ 1;
}//如果cookie匹配正则,则将变量$id设置为正则引用部分
if ($request_method=POST) {
返回405;
}//如果提交方法是POST,则返回状态405(不允许方法)。退货不能退301,302。
if(slow){
limit _ rate 10k
}//速度限制,$slow可以通过set命令设置
如果(!-f $请求文件名){
打破;
proxy _ pass http://127 . 0 . 0 . 1;
}//如果请求的文件名不存在,反向代理到localhost。这里的中断也停止了重写检查。
if ($args ~ post=140){
重写http://mysite.com/^永久;
}//如果查询字符串包含“post=140”,则永久重定向到mysite.com
在if指令中,可以使用全局变量。这些变量是:
$ args: #此变量等于请求行中的参数,与$query_string相同
$content_length:请求头中的内容长度字段。
$content_type:请求头中的内容类型字段。
$document_root:当前请求指定了根指令中的值。
$host:请求主机头字段,否则为服务器名。
$http_user_agent:客户端代理信息
$http_cookie:客户端cookie信息
$limit_rate:这个变量可以限制连接速率。
$request_method:客户端请求的动作,通常是GET或POST。
$remote_addr:客户端的IP地址。
$remote_port:客户端的端口。
$remote_user:已经通过Auth Basic模块验证的用户名。
$request_filename:当前请求的文件路径,由root或alias指令和URI请求生成。
$ scheme: http协议(比如http,https)。
$server_protocol:用于请求的协议,通常是HTTP/1.0或HTTP/1.1。
$server_addr:服务器地址,可以在系统调用完成后确定。
$server_name:服务器名称。
$server_port:请求到达服务器的端口号。
$request_URI:包含请求参数的原始URI,但不包含主机名,例如:“/foo/bar.php?”arg=baz .
$uri:没有请求参数的当前uri。$uri不包含主机名,例如“/foo/bar.html”。
$document_uri:与$uri相同。
使用return跳转
有时候我们需要使用重写在Nginx上做301地址跳转,比如下面的规则:
重写^ $ scheme://www . my site . com $ request _ uri永久;
当访问任何网址,301将被永久定向到www.mysite.com的网址。这样写是对的,但是因为重写的规律匹配,会浪费一些资源。nginx官网不推荐这种写法。我们也可以用return来实现301跳转,简单实用。参见示例:
01永久定向到新域名
服务器{
听80;
监听443 ssl
www.old-name.comold-name.com;
return 301 $ scheme://www . new-name . com;
}
上面的代码实现了旧域名301跳转到新域名。如果网站要换新域名,用这个方法做301跳转。
没有www的域名301跳转到带有www的域名。
服务器{
听80;
监听443 ssl
服务器名mysite.com;
return 301 $ scheme://www . my site . com $ request _ uri;
}
Http站点301跳转到https站点
服务器{
听80;
服务器名www.mysite.com;
return 301 https://www . my site . com $ request _ uri;
}
以上就是Nginx的重写和重定向的介绍。如果觉得有用,请多练习。好好保存这篇文章,你就不会迷路了。也希望大家能支持我们。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。