nginx重定向问题详解

nginx重定向问题!

首先看一段

rewrite方法

rewrite ^/a/(.*)$ /b/ last; # a跳转B,显示/a/
rewrite ^/a/(.*)$ /b/ permanent; # a跳转B,显示/b/
rewrite ^/xhcc/(.*)$ https://www.xhcss.com/ last; #由于跨域,直接就跳转了

location方法

这个方法很常见的是

#如果是以下目录运行php文件即禁止运行!
location ~ /(data|templets|uploads|html|images|xh|special|st|static)/.*\.(php|php5)?$ { 
deny all; 
}
#跳转部分文件
location ~ .*\.(js|css)$ {
                   rewrite ^/(.*) /js/$1 break;
                  proxy_pass http://x.y.com;
}

来说个代理的方法,把目录下全部文件代理到另外的网站或者端口

方法1

location ^~/jibingku/ {
                  rewrite /jibingku/(\d+) /$2 break;
                  proxy_pass http://www.xhcss.com/jibingku/;
            }

说明,先用rewrite 获取到后面的参数! 然后再转发代理

方法2

location ~* /wap/(\d+)/(.+)
{
proxy_pass http://mx$1.xhcss.com:6601/$2?$args;
}

方法3

location ~* /wap/(\d+)/(.+)
{
proxy_pass http://mx.xhcss.com:6601;
}

方法4

location ^~ /wap/
{
if ($request_uri ~ /wap/(\d+)/(.+))
{
set $bucketid $1;
set $params $2;
}
proxy_pass http://mx$bucketid.test.com:6601/$params;
}

方法详解

如果我们需要把域名直接进行跳转的话! 直接proxy即可!

 location ^~/jibingku/ {
                  proxy_pass http://www.xhcss.com;
                  add_header xh $upstream_addr; # 这是查看转发后的地址 可以删掉
            }

或者我们要在转发之前处理下链接! 比如/xh/css/a.php? 要变成 www.xhcss.com/xh/a.php?aid=css

那么我们可以

 location ^~/xh/ {
                  rewrite /xh/([^\/]+)/(.*)$ /xh/$2?aid=$1 break;
                  proxy_pass http://www.xhcss.com;
                  add_header xh $upstream_addr; # 这是查看转发后的地址
            }

说明

[^\/] 是非/ 字符,+ 是一个或者多个,详细请看正则

(.*) 剩下的全部

nginx location语法
基本语法:location [=|||^~] /uri/ { … }
= 严格匹配。如果这个查询匹配,那么将停止搜索并立即处理此请求。~ 为区分大小写匹配(可用正则表达式)
!~为区分大小写不匹配
~ 为不区分大小写匹配(可用正则表达式)
!~*为不区分大小写不匹配
^~ 如果把这个前缀用于一个常规字符串,那么告诉nginx 如果路径匹配那么不测试正则表达式。

示例

=====

location = / {

只匹配 / 查询。
}
location / {

匹配任何查询,因为所有请求都已 / 开头。但是正则表达式规则和长的块规则将被优先和查询匹配。
}
location ^~ /images/ {

匹配任何已 /images/ 开头的任何查询并且停止搜索。任何正则表达式将不会被测试。
}
location ~*.(gif|jpg|jpeg)$ {

匹配任何已 gif、jpg 或 jpeg 结尾的请求。
}
location ~*.(gif|jpg|swf)$ {
valid_referers none blocked start.igrow.cn sta.igrow.cn;
if (KaTeX parse error: Expected '}', got '#' at position 22: …d_referer) { #̲防盗链 rewrite ^…host/logo.png;
}
}


flag 标志位

break: 本条规则匹配完成后,终止匹配,不再匹配后面的规则
last: 相当于apache里面的[L]标记,表示rewrite,完成重写指令,之后搜索相应的URI或location
permanent: 返回301永久重定向,浏览器地址会显示跳转后的URL地址
redirect: 返回302临时重定向,浏览器地址会显示跳转后的URL地址
  • last 一般写在server和if中,而break 一般使用在location中。

  • last不终止重写后的URL匹配,即新的URL会再从server走一遍匹配流程,而break终止重写后的匹配

  • break和last都能组织继续执行后面的rewrite指令

  • last和break用来实现URL重写,浏览器地址栏URL地址不变

  • redirect和permanent用来实现URL跳转,浏览器地址栏会显示跳转后的URL地址。

别人写的!

Nginx的配置还是比较简单的,如:

location ~ /* 
{
proxy_pass http://127.0.0.1:8008;
}

或者可以

1

2

3

4

location /

{

proxy_pass http://127.0.0.1:8008;

}

Apache2的反向代理的配置是:

1

ProxyPass /ysz/ http://localhost:8080/

然而,如果要配置一个相对复杂的反向代理
Nginx相对Apache2就要麻烦一些了
比如,将url中以/wap/开头的请求转发到后台对应的某台server上
可以再Nginx里设置一个变量,来临时保存/wap/后面的路径信息

1

2

3

4

5

6

7

8

9

location ^~ /wap/

{

if ($request_uri ~ /wap/(\d+)/(.+))

{

set $bucketid $1;

set $params $2;

}

proxy_pass http://mx$bucketid.test.com:6601/$params;

}

也可以首先rewrite一下,然后再代理:

1

2

3

4

location ^~ /wap/{

rewrite /wap/(\d+)/(.+) /$2?$args break;

proxy_pass http://mx$1.test.com:6601;

}

或者

1

2

3

4

location ~* /wap/(\d+)/(.+)

{

proxy_pass http://mx$1.test.com:6601/$2?$args;

}

注意上面最后的?$args,表明把原始url最后的get参数也给代理到后台
如果在proxy_pass中使用了变量(不管是主机名变量$1或后面的$2变量),则必须得加这段代码
但如果pass_proxy后没用任何变量,则不需要加,它默认会把所有的url都给代理到后台,如:

1

2

3

4

location ~* /wap/(\d+)/(.+)

{

proxy_pass http://mx.test.com:6601;

}

而Apache2相对就简单多了:

1

2

3

4

5

6

ProxyPassMatch ^/wap/(.*)$  http://192.168.132.147/$1

  

if ($host ~* www.(.*)){

      set $host_without_www $1;

      rewrite (.*)$ http://$host_without_www/www$1;

    }

url的/问题
在nginx中配置proxy_pass时,当在后面的url加上了/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理走;如果没有/,则会把匹配的路径部分也给代理走。
 
下面四种情况分别用http://192.168.1.4/proxy/test.html 进行访问。
第一种:

1

2

3

location /proxy/ {

     proxy_pass http://127.0.0.1:81/;

}

会被代理到http://127.0.0.1:81/test.html 这个url
 
第二咱(相对于第一种,最后少一个 /)

1

2

3

location /proxy/ {

     proxy_pass http://127.0.0.1:81;

}

会被代理到http://127.0.0.1:81/proxy/test.html 这个url
 
第三种:

1

2

3

location /proxy/ {

     proxy_pass http://127.0.0.1:81/ftlynx/;

}

会被代理到http://127.0.0.1:81/ftlynx/test.html 这个url。
 
第四种情况(相对于第三种,最后少一个 / ):

1

2

3

location /proxy/ {

     proxy_pass http://127.0.0.1:81/ftlynx;

}

会被代理到http://127.0.0.1:81/ftlynxtest.html 这个url
 
上面的结果都是本人结合日志文件测试过的。从结果可以看出,应该说分为两种情况才正确。即http://127.0.0.1:81 (上面的第二种) 这种和 http://127.0.0.1:81/.... (上面的第1,3,4种) 这种。


相关内容

发表评论

验证码:
点击我更换图片

最新评论