【Nginx】使用Rewrite实现地址重写
一、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; }
评论