nginx-rewrite重定向跳转实例
工作中常用到nginx的rewrite,网上许多文章也写了一些,不过实用性的话,还是往下看吧。
nginx重定向-跳转实例:
1,将www.a.com/connect 跳转到connect.a.com
rewrite ^/connect$ http://connect.a.com permanent;
2,将connect.a.com 301跳转到www.a.com/connect/
if ($host = "connect.a.com"){
rewrite ^/(.*)$ http://www.a.com/connect/$1 permanent;
}
3,a.com 跳转到www.a.com
if ($host != 'www.a.com' ) {
rewrite ^/(.*)$ http://www.a.com/$1 permanent;
}
4,www.a.com/category/123.html 跳转为 category/?cd=123
rewrite "/category/(.*).html$" /category/?cd=$1 last;
5,www.a.com/admin/ 下跳转为www.a.com/admin/index.php?s=
if (!-e $request_filename){
rewrite ^/admin/(.*)$ /admin/index.php?s=/$1 last;
}
6,在后面添加/index.php?s=
if (!-e $request_filename){
rewrite ^/(.*)$ /index.php?s=/$1 last;
}
7,www.a.com/xinwen/123.html 等xinwen下面数字+html的链接跳转为404
rewrite ^/xinwen/([0-9]+)\.html$ /404.html last;
8,http://www.a.com/news/radaier.html 301跳转 http://www.a.com/strategy/
rewrite ^/news/radaier.html http://www.a.com/strategy/ permanent;
9,重定向 链接为404页面
rewrite http://www.a.com/123/456.php /404.html last;
10, 禁止htaccess
location ~//.ht {
deny all;
}
11, 可以禁止/data/下多级目录下.log.txt等请求;
location ~ ^/data {
deny all;
}
12, 禁止单个文件
location ~ /www/log/123.log {
deny all;
}
13, 将http://test.com/news/activies/2014-08-26/123.html 跳转为 http://a.com/news/activies/123.html
rewrite ^/news/activies/2014\-([0-9]+)\-([0-9]+)/(.*)$ http://a.com/news/activies/$3 permanent;
14,nginx多条件重定向rewrite
如果需要打开带有play的链接就跳转到play,不过/admin/play这个不能跳转
if ($request_filename ~ (.*)/play){ set $payvar '1';}
if ($request_filename ~ (.*)/admin){ set $payvar '0';}
if ($payvar ~ '1'){
rewrite ^/ http://play.a.com/ break;
}
15,http://www.a.com/?gid=6 跳转为http://www.a.com/123.html
if ($request_uri ~ "/\?gid\=6"){return http://www.a.com/123.html;}
16,公司有主站(电脑端)和微站(手机访问),同一个域名,需要跳转到相应目录:
server_name www.a.com;
index index.html index.htm;
root /www/a/;
location / {
if ( $http_user_agent ~ "(WAP)|(Mobile)|(iPhone)|(Android)|(WindowsCE)|(Opera)"){
root /www/a/wap;
}
}
17,访问http://www.abc.com?url=https://test.github.io 301到 https://test.github.io
if ($request_uri ~ "/\?url\=(.*)"){ return 301 $1 ;}
或者
if ($query_string ~ "url=(\w+)") { return 301 $arg_url;}
下面来个实战,好好看看nginx rewrite的强大:
需求如下
http://m.a.com/wap/改为http://wap.a.com/
http://m.a.com/xb2/wap/改为http://wap.a.com/xb2/
http://m.a.com/xb2/wap/news/ 改为http://wap.a.com/xb2/zh/xw/
http://m.a.com/xb2/wap/radier/改为http://wap.a.com/xb2/yxgl/
http://m.a.com/wap/game_list/改为:http://wap.a.com/game/
http://m.a.com/wap/game_list/games/?id=10改为http://wap.a.com/game/list/?id=10
set $arg 0;
if ($request_filename ~ m.a.com/xb2/wap){ set $arg "${arg}1" ;}
if ($request_filename ~ m.a.com/xb2/wap/news){ set $arg "${arg}11"; }
if ($request_filename ~ m.a.com/xb2/wap/radier){ set $arg "${arg}111"; }
if ($arg = '01'){rewrite ^/ http://wap.a.com/xb2/ permanent;}
if ($arg = '0111'){ rewrite ^/ http://wap.a.com/xb2/zh/xw permanent;}
if ($arg = '01111'){ rewrite ^/ http://wap.a.com/xb2/yxgl permanent;}
set $arg 0;
if ($request_filename ~ m.a.com/wap/game_list){ set $arg "${arg}1" ;}
if ($request_filename ~ m.a.com/wap/game_list/games/(.*)$){ set $arg "${arg}11"; }
if ($arg = '01'){ rewrite ^/ http://wap.a.com/game/ permanent;}
if ($arg = '0111'){ rewrite ^/ http://wap.a.com/game/list/$1 permanent;}
if ($request_filename ~ "m.a.com/wap/"){rewrite ^/(.*)$ http://wap.a.com/ permanent;}
17, 现在我们用阿里云、七牛的免费ssl证书,对nginx的http跳转https rewrite如下
server {
listen 80;
server_name test.com www.test.com;
return 301 https://test.com$request_uri;
}
变量的说明: var_request_uri,比如:
$request_uri:
full original request URI (with arguments)
$request_method:
request method, usually “GET
” or “POST
”
$request_filename:
file path for the current request, based on the root or alias directives, and the request URI
18.多个条件的跳转
location / {
if ($test ~* '^abcd$|^xyz$') {
proxy_pass http://test_com;
}
}
curl -H “test:abcd” http://localhost
正则表达式匹配,其中:
~ 为区分大小写匹配
~* 为不区分大小写匹配
!~和!~*分别为区分大小写不匹配及不区分大小写不匹配
文件及目录匹配,其中:
-f和!-f用来判断是否存在文件
-d和!-d用来判断是否存在目录
-e和!-e用来判断是否存在文件或目录
-x和!-x用来判断文件是否可执行
flag标记有:
last 相当于Apache里的[L]标记,表示完成rewrite
break 终止匹配, 不再匹配后面的规则
redirect 返回302临时重定向 地址栏会显示跳转后的地址
permanent 返回301永久重定向 地址栏会显示跳转后的地址
下面和nginx重定向没有关系,只是资源路径有多个
location ~.*\(htm|html|gif|jpg|jpeg|png|bmp|swf|js|css)$ {
root /usr/local/nginx/www/img;
if (! -f $request_filename)
{
root /var/www/html/img;
}
if (! -f $request_filename)
{
root /apps/images;
}
}
有些时候rewrite的功能可以用proxy_pass实现,比如
rewrite ^/a/(.*)$ http://b.com/abcd/a/$1 permanent;
location /a/ {
proxy_pass http://b.com/abcd/a/;
}
nginx中配置proxy_pass代理转发,如果在proxy_pass后面的url加/,表示绝对根路径
如果没有/,表示相对路径,把匹配的路径部分也给代理
下面四种情况都用 http://127.0.0.1/proxy/test.html 进行访问
第一种:
location /proxy/ {
proxy_pass http://127.0.0.1/;
}
代理到URL:http://127.0.0.1/test.html
第二种 相对于第一种,最后少一个 /
location /proxy/ {
proxy_pass http://127.0.0.1;
}
代理到URL:http://127.0.0.1/proxy/test.html
第三种:
location /proxy/ {
proxy_pass http://127.0.0.1/aaa/;
}
代理到URL:http://127.0.0.1/aaa/test.html
第四种 相对于第三种,最后少一个 /
location /proxy/ {
proxy_pass http://127.0.0.1/aaa;
}
代理到URL:http://127.0.0.1/aaatest.html
2016年03月01日 于 linux工匠 发表