,,详解常用的nginx rewrite重写规则

,,详解常用的nginx rewrite重写规则

本文主要介绍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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • nginx配置访问图片,nginx配置图片服务器
  • nginx配置访问图片,nginx配置图片服务器,Nginx搭建图片视频服务器的部署步骤
  • nginx负载均衡配置详解linux,nginx负载均衡服务器对性能有要求吗
  • nginx负载均衡配置详解linux,nginx负载均衡服务器对性能有要求吗,详解Nginx服务器之负载均衡策略(6种)
  • nginx正向代理与反向代理详解区别,nginx的正向代理和反向代理
  • nginx正向代理与反向代理详解区别,nginx的正向代理和反向代理,nginx正向代理与反向代理详解
  • nginx日常优化有哪些,nginx日常优化有哪些
  • nginx日常优化有哪些,nginx日常优化有哪些,nginx优化的六点方法
  • nginx拦截,nginx 屏蔽IP
  • nginx拦截,nginx 屏蔽IP,Nginx服务器屏蔽与禁止屏蔽网络爬虫的方法
  • nginx实现负载均衡几种方式,nginx负载均衡配置详解linux
  • nginx实现负载均衡几种方式,nginx负载均衡配置详解linux,使用nginx进行负载均衡的搭建全过程
  • nginx安装及配置教程,Nginx怎么安装
  • nginx安装及配置教程,Nginx怎么安装,Nginx 安装详细教程
  • nginx基本原理,nginx实现原理
  • 留言与评论(共有 条评论)
       
    验证码: