Nginx achieve rewrite rewrite

Rewrite basic overview

What is the rewrite

Rewrite the main achievement of the url rewrite, and redirect incoming is to webredirect requests to other urlprocesses.


Rewrite usage scenarios

1, forwarding, a user access www.drz.com this URL that directs it to a new domain name mobile.drz.com
2, protocol jump, when the user requests the site will be re-jump by http protocol to https agreement
3, pseudo-static, dynamic pages will be displayed as a technique for static pages the way for easy entry of search engines, while built on a dynamic URL address of external exposure to too many parameters to enhance the higher security.
4, search engine, SEO optimization depends on the url path, url easy to remember the wisdom search engine entry


Rewrite configuration example

句法:Syntax:  rewrite regex replacement [flag]
默认:Default: --
语境:Context: server,location,if

#用于切换维护页面场景
#rewrite ^(.*)$ /page/maintain.html break;

Rewrite flag Flag

rewriteThe expression instructions to redirect URLor modify a string, can be applied to server,location,ifthe environment, each row rewritethe last instruction with a flagtag, supported flagnumerals shown in the following table:

flag effect
last After the completion of this rule match, match stopped, no longer matches the rule back
break After the completion of this rule match, match stopped, no longer matches the rule back
redirect 302 temporary redirect return address after the jump address bar displays
permanent Returned 301 permanent redirect, the address after the jump address bar displays

Comparative Example differs from the last break

[root@web01 conf.d]# cat rewrite.conf 
server {
        listen 80;
        server_name rewrite.gjy.com;
        root /code;

        location ~ ^/break {
                rewrite ^/break /test/ break;
        }
        location ~ ^/last {
                rewrite ^/last /test/ last;
        }
        location /test/ {
                default_type application/json;
                return 200 "ok";
        }
}

[root@web01 conf.d]#  mkdir  /code
[root@web01 conf.d]# echo gjy.test_web01 > /code/test/index.html
#重启nginx服务
[root@web01 conf.d]# nginx -t 
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@web01 conf.d]# nginx -s reload

Visit Web browser

If you know shell script, which is similar to two scripts, break and continue

Browser access break


Browser to access the last


last and break difference

as long as the match to break the rules, it will go to local configuration directory to find the path of the requested documents;
and last as long as the match to the rule, it will be where the server (...) label re-initiate the request.

break请求:
1、请求rewrite.gjy.com/break
2、首先:会去查找本地的/code/test/index.html;
3、如果找到了,则返回/code/test/index.html的内容;
4、如果没找到该目录则报错404,如果找到该目录没找到对应的文件则403

last请求:
1、请求rewrite.gjy.com/last
2、首先:会去查找本地的/code/test/index.html;
3、如果找到了,则返回/code/test/index.html的内容;
4、如果没找到,会对当前server重新的发起一次请求,rewrite.gjy.com/test/
5、如果有location匹配上,则直接返回该location的内容。
4、如果也没有location匹配,再返回404;

Therefore, when accessing / break and / last request, although the corresponding request directory / test did not exist, in theory, should return 404, but in fact request / last time, there will be matched to the location behind results are returned, the reason this is it.


Comparative Example differs permanent redirect

[root@web01 conf.d]# cat rewrite.conf 
server {
        listen 80;
        server_name rewrite.gjy.com;
        root /code;

        location /test {
                rewrite ^(.*)$  http://www.baidu.com redirect;
                #rewrite ^(.*)$  http://www.baidu.com permanent;
                #return 301 http://www.baidu.com;
                #return 302 http://www.baidu.com;
        }
}

redirect the difference between permanent (achieve https)

redirect: 每次请求都会询问服务器,如果当服务器不可用时,则会跳转失败。

permanent: 第一次请求会询问,浏览器会记录跳转的地址,第二次则不再询问服务器,直接通过浏览器缓存的地址跳转。

Rewrite the rules of practice

Before writing rewrite rules, we need to open rewrite the log of matching rules for debugging.

[root@web01 code]# vim /etc/nginx/nginx.conf
/var/log/nginx/error.log notice;

http{
    rewrite_log on;
}

Case number one

User access /abc/1.htmlis actually true is accessible/ccc/bbb/2.html

#http://www.drz.com/abc/1.html  ==>  http://www.drz.com/ccc/bbb/2.html

#1.准备真实访问路径
[root@web03 ~]# mkdir /code/ccc/bbb -p
[root@web03 ~]# echo "ccc_bbb_2" > /code/ccc/bbb/2.html

#2.Nginx跳转配置
[root@web03 ~]# cd /etc/nginx/conf.d/
[root@web03 conf.d]# cat ccbb.conf 
server {
        listen 80;
        server_name  www.ccbb.com;
        
        location / {
                root /code;
                index index.html;
        }
        location /abc {
                rewrite (.*) /ccc/bbb/2.html redirect;
                #return 302 /ccc/bbb/2.html;
        }
}

#3.重启Nginx服务
[root@web03 conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@web03 conf.d]# nginx -s reload


Case II

User access /2018/ccc/2.htmlis actually true is accessible/2014/ccc/bbb/2.html

##http://www.ccbb.com/2018/ccc/bbb/2.html  ==>  http://www.ccbb.com/2014/ccc/bbb/2.html

#1.准备真是的访问路径
[root@web03 conf.c]# mkdir /code/2014/ccc/bbb -p 
[root@web03 conf.c]# echo "2014_ccc_bbb_2" > /code/2014/ccc/bbb/2.html

#2.Nginx跳转配置
[root@web03 conf.d]# cat ccbb.conf 
server {
        listen 80;

        location / {
                root /code;
                index index.html;
        }
        location /2018 {
                rewrite ^/2018/(.*)$ /2014/$1 redirect;
        }
}

#3.重启nginx服务
[root@web03 conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@web03 conf.d]# nginx -s reload


Case III

User access / test access is actually true https://www.baidu.com

#1.Nginx跳转配置
[root@web03 conf.d]# cat test.conf 
server {
        listen 80;

        location /test {
                rewrite (.*) https://www.baidu.com redirect;
        }
}

#2.重启nginx服务
[root@web03 conf.d]# nginx -s reload


Case Four

User access course-11-22-33.htmlis actually true is accessible/course/11/22/33/course_33.html

#http://www.drz.com/course-11-22-33.html  ==>  http://www.drz.com/course/11/22/33/course_33.html

#1.准备真是的访问路径
[root@web03 ~]# mkdir /code/course/11/22/33 -p
[root@web03 ~]# echo "curl docs.etiantian.org" > /code/course/11/22/33/course_33.html

#2.Nginx跳转配置
[root@web03 conf.d]# cat test.conf 
server {
        listen 80;
        root /code;
        index index.html;
        location / {
                #灵活配法
                rewrite ^/course-(.*)-(.*)-(.*).html$ /course/$1/$2/$3/course_$3.html redirect;
                #固定配法
                #rewrite ^/course-(.*) /course/11/22/33/course_33.html redirect;
        }
}

#3.重启nginx服务
[root@web03 conf.d]# nginx -s reload


Case 5

The httprequest to jumphttps

#Nginx跳转配置
server {
        listen 80;
        server_name www.drz.com;
        rewrite ^(.*) https://$server_name$1 redirect;
        #return 302 https://$server_name$request_uri;
}       

server {
        listen 443;
        server_name www.driverzeng.com;
        ssl on;
}

Rewrite scenario example

#部署discuz论坛
[root@web01 conf.d]# vim discuz.drz.com.conf
server {
        listen 80;
        server_name discuz.gjy.com;

        location / {
                root /code/discuz/upload;
                index index.php index.html;
        }

        location ~ \.php$ {
                root /code/discuz/upload;
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
        }
}

#创建站点目录部署代码
[root@web01 ~]# mkdir /code/discuz
[root@web01 ~]# rz Discuz_X3.3_SC_GBK.zip
[root@web01 ~]# unzip Discuz_X3.3_SC_GBK.zip -d /code/discuz/

#授权站点目录
[root@web01 discuz]# chown www.www -R /code/

#创建数据库
[root@db01 ~]# yum install -y mariadb-server
[root@db01 ~]# systemctl start mariadb
[root@db01 ~]# mysqladmin -uroot password '123'
[root@db01 ~]# mysql -uroot -p123
#创建库
MariaDB [(none)]> create database discuz;
Query OK, 1 row affected (0.00 sec)
#授权库
MariaDB [(none)]> grant all on discuz.* to discuz@'%' identified by '123';
Query OK, 0 rows affected (0.00 sec)

#测试远程连接数据库
[root@web01 ~]# yum install -y mariadb
[root@web01 ~]# mysql -udiscuz -p123 -h172.16.1.51
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 4
Server version: 5.5.60-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> \q
Bye





Check pseudo-static pages set

server {
        listen 80;
        server_name discuz.gjy.com;

        location / {
                root /code/discuz/upload;
                index index.php index.html;
                rewrite ^([^\.]*)/topic-(.+)\.html$ $1/portal.php?mod=topic&topic=$2 last;
                rewrite ^([^\.]*)/article-([0-9]+)-([0-9]+)\.html$ $1/portal.php?mod=view&aid=$2&page=$3 last;
                rewrite ^([^\.]*)/forum-(\w+)-([0-9]+)\.html$ $1/forum.php?mod=forumdisplay&fid=$2&page=$3 last;
                rewrite ^([^\.]*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=viewthread&tid=$2&extra=page%3D$4&page=$3 last;
                rewrite ^([^\.]*)/group-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=group&fid=$2&page=$3 last;
                rewrite ^([^\.]*)/space-(username|uid)-(.+)\.html$ $1/home.php?mod=space&$2=$3 last;
                rewrite ^([^\.]*)/blog-([0-9]+)-([0-9]+)\.html$ $1/home.php?mod=space&uid=$2&do=blog&id=$3 last;
                rewrite ^([^\.]*)/(fid|tid)-([0-9]+)\.html$ $1/archiver/index.php?action=$2&value=$3 last;
                if (!-e $request_filename) {
                    return 404;
                }
        }

        location ~ \.php$ {
                root /code/discuz/upload;
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
        }
}
将http请求跳转到https
    

discuz解释rewrite

thread-1-1-1.html

rewrite ^([^\.]*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ 

$1/forum.php?mod=viewthread&tid=1&extra=page%3D1&page=1 last;

Rewrite rules supplement

Rewrite matching priority

1. The first block rewrite instruction execution server
2. Next execution location matching rule
3. Finally, the execution location rewrite


Nginx Rewrite and global variables

Rewrite in the matching process, Nginx will use some global variables

$server_name    #当前用户请求的域名

server {
        listen 80;
        server_name test.drz.com;
        rewrite ^(.*)$ https://$server_name$1;
}
$request_filename 请求的文件路径名(带网站的主目录/code/images/test.jpg)
$request_uri 当前请求的文件路径(不带网站的主目录/inages/test.jpg)

#大多数用于http协议转gttps协议
server {
        listen 80;
        server_name php.drz.com;
        return 302 https://$server_name$request_uri;
}
$scheme 用的协议,比如http或者https

Rewrite the rules of how to write more standardized

server {
        listen 80;
        server_name www.drz.com drz.com;
        if ($http_host = drz.com){
            rewrite (.*) http://www.drz.com$1;
        }
}

#推荐书写格式
server {
        listen 80;
        server_name drz.com;
        rewrite ^ http://www.drz.com$request_uri;
}
server {
        listen 80;
        server_name www.drz.com;
}

rewrite priority combat

Environment with

[root@web01 conf.d]# vim youxianji.conf
server {
        listen 80;
        server_name tz.gjy.com;

        rewrite (.*) http://www.baidu.com break;
      
        location / {
                rewrite (.*) http://www.jd.com redirect;
        }
        location /test {
                rewrite (.*) http://www.driverzeng.com;
        }

}
[root@web01 conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@web01 conf.d]# nginx -s reload

1. In the server layer is configured with a rewrite of the time, location layer does not take effect

Browser access, tz.gjy.com, appearance is https://www.baidu.com

Browser access, tz.gjy.com / test, appearance or https://www.baidu.com

2. When the server layer configuration rewrite commented, location layer to take effect

[root@web01 conf.d]# cat youxianji.conf 
server {
        listen 80;
        server_name tz.gjy.com;

        #rewrite (.*) http://www.baidu.com break;

        location / {
                rewrite (.*) http://www.jd.com redirect;
        }
        location /test {
                rewrite (.*) http://www.driverzeng.com;
        }

}

Access tz.gjy.com again, will have access to the location layer https://www.jd.com/

Access tz.gjy.com/test again, will have access to https://www.driverzeng.com/

Guess you like

Origin www.cnblogs.com/gongjingyun123--/p/11432521.html