【Nginx】使用Rewrite实现地址重写

Tanglu WebServer 2023-04-20 274 0

一、Nginx Rewrite介绍

Nginx通过ngx_http_write_module模块可以实现地址重写的功能,也就是常说的Rewrite。具体实现的过程就是通过PCRE正则表达式来对匹配到的地址进行重写,应用场景:网站更换域名后需要让访问旧域名的用户自动跳转到新域名。Rewrite和另一个实现地址转换的proxy_pass不同之处在于Rewrite一般用于内部地址转换,proxy_pass用于不同服务器跳转,实现反向代理


二、Nginx Rewrite语法

# rewrite regex replacement [flag]  #作用域为server、location、if

#示例
location /old/ {
  rewrite ^/old/(.*)$ /new/$1 permanent;
}

配置文件中的regex表示需要被匹配或者说需要被转发的原URL,通常使用正则表达式来进行匹配;replacement表示转发后的新URL;flag是非必配项,用于标记rewrite的四种类型,分别是last、break、redirect、permanent

· last:不会让浏览器地址因为重写而产生变化,且状态码都会只显示200,会拿重写后的URL进入server段重新进行匹配

· break:不会让浏览器地址因为重写而产生变化,且状态码都会只显示200。不会拿重写后的URL进入server段重新进行匹配。比如有一条规则是让使用IE客户端的用户跳转到特定页面,当使用break时Nginx会不再继续匹配。而使用last则会一直循环,直到达到10次后返回500错误。通常使用alias指令时用last标记,使用proxy_pass指令时,使用break标记

· redirect:实现302临时重定向,浏览器会显示跳转后的URL地址,Nginx访问日志中会看到进行了2次请求,先30X,再200。使用临时重定向时客户端的每次请求都会向后端重新发起,适合短期重定向,例如在网站维护期间暂时将流量转移到另一个 URL

· permanent:实现301永久重定向,浏览器会显示跳转后的URL地址,Nginx访问日志中会看到进行了2次请求,先30X,再200。客户端不会每次都向后端服务重新发起请求,如果后端服务停止,使用301永久重定向的话也是继续向该服务继续发起请求。更适合SEO,因为它会告诉搜索引擎以后都应该使用新的 URL,并将权重传递给新的页面


三、Nginx Rewrite示例

1、将所有请求转发到一个maintain.html维护页面

rewrite ^(.*)$  /pages/maintain.html break;
rewrite ^(.*)$ /chrome/$1  #这里的$1用到了正则后项引用,代表第一个括号内的内容


2、将IE浏览器的请求rewrite到/msie目录下

if ($http_user_agent ~ MSIE) {
  rewrite  ^(.*)$ /msie/$1 break; 
}


3、将所有80请求转发到443

server{
    listen  80;
    server_name www.linuxe.cn;
    rewrite ^(.*)  https://$server_name$1 redirect ;
    #return 301 https://$server_name$request_uri ; 另一种写法
}


4、将www.linuxe.cn/centos/转发到www.linuxe.cn/linux/

server {
        listen 80;
        server_name www.linuxe.cn;
        rewrite ^/centos https://www.linuxe.cn/linux  permanent;
        location / {
            proxy_pass http://linuxe_Backend;
        }
}


5、使用Rewrite实现全站https

server {
           listen 80;
           server_name travel.xiebao18.com;
           rewrite  ^/(.*)$ https://travel.xiebao18.com/$1 permanent;
   }

server {
          listen 443;
          server_name travel.xiebao18.com;
          limit_conn perserver 10000;
          ssl on;
          ssl_certificate ssl/qixin18.com.pem;
          ssl_certificate_key ssl/qixin18.com.key;
          ssl_session_timeout  5m;
          ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
          ssl_ciphers  HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM;
          ssl_prefer_server_ciphers   on;
        
          location / {
              proxy_next_upstream error timeout http_503 http_504 http_502;
              proxy_connect_timeout 500s;
              proxy_read_timeout 500s;
              proxy_send_timeout 500s;
              proxy_set_header Host $http_host;
              proxy_set_header X-Real-IP $remote_addr;
              proxy_set_header X-Forwarded-For $remote_addr;
              proxy_pass http://travel_node_Backend;
          }

  }


6、当访问的文件和目录不存在时,重定向到指定文件

if( !-e $request_filename )
{
rewrite ^/(.*)$ index.php last;
}


7、如果客户端使用的是IE浏览器,则重定向到/ie目录下

if( $http_user_agent  ~ MSIE)
{
rewrite ^(.*)$ /ie/$1 break;
}


8、禁止访问以.sh,.flv,.mp3为文件后缀名的文件

location ~ .*\.(sh|flv|mp3)$
{
return 403;
}


9、域名跳转

server
{
listen      80;
server_name  jump.linuxe.cn;
index index.php;
root  /www;
rewrite ^/ https://www.linuxe.cn/;
access_log  off;
}


评论