Nginx Rewrite(伪静态)重写规则

时间:18-10-11 来源: 作者: 点击:

Rewrite 主要的功能就是实现URL的重写,Nginx的rewrite功能是使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向。本文给大家讲述实际项目中常用到的rewrite规则。

Nginx的rewrite功能需要PCRE软件的支持,即通过perl兼容正则表达式语句进行规则匹配的。默认参数编译nginx就会支持rewrite的模块,但是也必须要PCRE的支持

rewrite是实现URL重写的关键指令,根据regex(正则表达式)部分内容,重定向到replacement,结尾是flag标记。

nginx rewrite指令执行顺序

如果其中某步URI被重写,则重新循环执行1-3,直到找到真实存在的文件。

如果循环超过10次,则返回500 Internal Server Error错误。

flag标志位

rewrite的语法很简单,如:

rewrite regex URL [flag];

rewrite是关键字,regex是正则表达式,URL是要替代的内容,[flag]是标记位的意思,它有以下几种值:

因为301和302不能简单的只返回状态码,还必须有重定向的URL,这就是return指令无法返回301,302的原因了。这里 last 和 break 区别有点难以理解:

来看一个简单实例:

rewrite ^/listings/(.*)$ /listing.html?listing=$1 last;rewrite ^/images/(.*)_(\d+)x(\d+)\.(png|jpg|gif)$ /resizer/$1.$4?width=$2&height=$3? last;

第一条重写规则中,我们可以使用友好的URL:代替?listing=123,就相当于我们在浏览器的地址栏中输入后,实际访问的URL资源是?listing=123。

第二条规则中,对形如的文件请求,重写到?width=500&height=400地址,并会继续尝试匹配location。

if指令与全局变量


if指令语法为if(condition){...},对给定的条件condition进行判断。如果为真,大括号内的rewrite指令将被执行。

来看代码规则:

if ($http_user_agent ~ MSIE) {     rewrite ^(.*)$ /msie/$1 break; } //如果UA包含"MSIE",rewrite请求到/msid/目录下if ($http_cookie ~* "id=([^;]+)(?:;|$)") {    set $id $1;  } //如果cookie匹配正则,设置变量$id等于正则引用部分if ($request_method = POST) {    return 405; } //如果提交方法为POST,则返回状态405(Method not allowed)。return不能返回301,302if ($slow) {     limit_rate 10k; } //限速,$slow可以通过 set 指令设置if (!-f $request_filename){    break;     proxy_pass  ;  } //如果请求的文件名不存在,则反向代理到localhost 。这里的break也是停止rewrite检查if ($args ~ post=140){     rewrite ^  permanent; } //如果query string中包含"post=140",永久重定向到mysite.com

if指令中,可以使用全局变量,这些变量有:

使用return跳转

我们有时需要在Nginx上使用rewrite做301地址跳转,比如以下规则:

rewrite ^ $scheme://www.mysite.com$request_uri permanent;

当访问任意url都会301永久定向到的url上。这个写法没错,但是因为使用了rewrite的正则匹配,会损耗一部分资源,nginx官网不推荐这样写。我们可以使用return同样可以实现301跳转,简单实用,看实例:

301永久定向到新域名

server {    listen 80;    listen 443 ssl;    server_name  old-name.com;    return 301 $scheme://www.new-name.com; }

以上代码实现了老域名301跳转到新域名上,假如网站要更换新域名的话使用此方法做301跳转。

不带www的域名301跳转到带www的域名

server {    listen 80;    listen 443 ssl;    server_name mysite.com;    return 301 $scheme://www.mysite.com$request_uri; }

http站点301跳转到https站点

server {    listen 80;    server_name ;    return 301 https://www.mysite.com$request_uri; }

以上就是有关Nginx的rewrite重写与重定向的介绍,觉得有用就请练习多遍,收藏好此文不迷路。


玄玄博客:

环企优站:

高端定制:

  • 355

    给力

  • 200

    淡定

  • 253

    学习

  • 10

    坑爹

  • 151

    打酱油

  • 声明:本文转载于网络,文章链接:http://www.nd9p.com/10898.html