【Nginx】双代理以及复杂条件的rewrite跳转,nginxrewrite跳转


【Nginx】双代理以及复杂条件的rewrite跳转

一开始,主机上只有一个nginx,监听80端口,几年过去了,一直相安无事……

后来,野生的OpenResty小三出现了……OpenResty小三使出了“Lua大法好”……效果拔群……

因为nginx上挂着别的东西,我不想停掉它换成OpenResty,因为容易导致OpenResty的Bug影响蔓延,其次是因为我需要反复的调试lua,会影响别人的东西……

所以还要继续坚持80端口的nginx作为主代理方针不动摇,然后OpenResty另起炉灶高度自治……

首先给OpenResty分配个端口,比如说叫8888(吉利),然后,将指定域名的请求代理到OpenResty上……

假设我的主机IP是123.123.123.123(不要问我这是哪一类IP地址,这是我编的),我与此相关的有两个域名domain.com和domain.cn

于是首先要配域名,给domain.com和domain.cn的*做A记录,指向123.123.123.123

nginx的配置,给nginx多添加个server节点(部分):

server
{
	listen       80;
	server_name  *.domain.com *.domain.cn;
	server_name_in_redirect off;
	proxy_set_header Host $host:$server_port;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header REMOTE-HOST $remote_addr;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    
	location  /
	{
		proxy_pass http://123.123.123.123:8888/;
	}
}
之后nginx reload一下,就不要再动了

nginx -s reload
之后是漫长的OpenResty的配置调试之旅……

首先,我想在域名下面挂两个项目,一个常用的www项目,还有一个不常用的app项目

在正常情况下,所有乱七八糟的二级域名都自动跳转到www项目,但是app除外,app要有自己的人生

另外,我希望.cn域名虽然也可以用,但是我希望.com域名是主域名,正常情况下都自动跳转到.com域名下

然后就是还要有我亲爱的lua做动态页面或者ajax返回……

我还是花费了一晚上时间调通了这种需求……

面临的困难:

1、nginx的条件格式极为严格,一个空格都不能少

2、nginx不支持and、or之类的逻辑关系运算,对于复杂的条件判断需要用变量来控制

3、如果配置错误,会出现重定向循环之类的错误,而且很难通过日志定位是什么原因

4、由于浏览器缓存的存在,有些重定向循环可能是,所以要时刻注意清空浏览器缓存,否则,验证结果很可能是错误的……

然后,上配置:

    server {
        listen       8888;
	server_name  *.domain.com *.domain.cn;
        index  index.html index.htm;

        location / {
		set $doRewrite 'www';
		if ( $host = 'www.domain.com' ) {
			root  /home/me/www/;
			set $doRewrite '0';
		}
		if ( $host ~ 'app\.domain\.(.+)' ) {
			set $doRewrite 'app';
		}
		if ( $host = 'app.domain.com' ) {
    			root  /home/me/app/;
			set $doRewrite '0';
		}
		if ( $doRewrite = 'www' ) {
			rewrite ^/(.*)$ http://www.domain.com/$1 permanent;
		}
		if ( $doRewrite = 'app' ) {
			rewrite ^/(.*)$ http://app.domain.com/$1 permanent;
		}
        }

	location ~ /([-_a-zA-Z0-9/]+).lualu {
		default_type text/html;
		set $path $1;
		lua_need_request_body on;
		content_by_lua_file /home/me/luaAction/$path.lua;
	}
    }
最后,说明一下:

访问www.domain.com的时候,可以访问到www目录下的html

访问app.domain.com的时候,可以访问到app目录下的html

对于app.domain.cn则会跳转到app.domain.com

剩余其他的域名都会默认跳转到www.domain.com

访问后缀为lualu时,为luaAction目录下的lua文件的运行结果

整个过程由doRewrite变量控制,通过对doRewrite变量的复制来决定是否跳转以及跳转到哪个路径下


分享出来希望对大家有所帮助,不要再总是像我这样调了一晚上的重定向循环……


相关内容

    暂无相关文章