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种) 这种。