为解决资源整合的问题,需要使用Nginx对局域网内部的网站进行统一管理进行反向代理,以供外网访问。
根据URI(全球统一资源定位符)的定义
[scheme:][//host:port][path][?query][#fragment]
可知,常规用于区分站点的手段有三种
1,域名host
2,端口port
3,IP
域名需要DNS解析和绑定,不方便管理,而且被工信部限制使用(域名需要备案)
端口除了防火墙限制了端口开放外(局域网防火墙只允许特定少数端口开放如80),也受到ISP(网络供应商,如电信等的限制)
局域网网络处理局域网内,外网IP数量有限,校内资源无法使用IP进行对外公布
所以从常规的三种手段都无法解决这个难题
根据当前系统部署现状,以及网络环境,前面三种常用的技术方案都不太适用,因此延伸考虑path,但path通用的防火墙或者域名提供商难以对Path进行区分和转发,因此这需要一台独立的服务器以及特定的容器应用程序设置区分.
实现原理:
1. 服务器指定域名为:www.test.com
2. 设置Path(虚拟目录)www.test.com/source1
3. 将Path资源重定向到内部网络服务资源
查了诸多文档,以下链接的文档有参考价值,但也达不到目的
http://blog.csdn.net/dyllove98/article/details/8923212
server
{
listen 80;
location /test {
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_pass http://192.168.0.37/test/;
proxy_set_header Host 192.168.0.37;
proxy_set_header X-Forwarded-For $remote_addr;
}
location / {
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_pass http://192.168.0.37/;
proxy_set_header Host 192.168.0.37;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
这段代码如果是单一的二级目录其实是可以转发的,受它启发证明二级目录转发是可以实现的,那问题来了,如果存在多个要如何办呢?https://zhangge.net/5054.html链接给出了另名的方式用upstream转发,原理也差不多。代码就不贴了。
综上所述要解决多个二级目录转发问题,关键是转发后,页面带的资源文件,没有带二级目录,以致资源丢失,说人话就是:
aaa.com/aaa -> 192.168.0.1 域名aaa.com/aaa指向内部地址,但当页面包含资源时,这些资源就没有/aaa了这样导致资源无法定向到192.168.0.1了。
因为http是无状态的,URL本身包含的内容已经无法用于再标识其本身,所以此时作为一个码狗突然想起本职工作,不如用Cookie标识一下。然后查阅了Nginx带的Cookie功能,果然可以,下面上菜了。
server {
listen 88;
server_name ~^\d+\.\d+\.\d+\.\d+$;
location /sise {
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_pass http://www.sise.com.cn/;
proxy_set_header Host www.sise.com.cn;
proxy_set_header X-Forwarded-For $remote_addr;
#这里设置根据虚拟目录设置一个HOST到客户端记住用户是访问test的
add_header Set-Cookie 'host=www.sise.com.cn';
}
location /mis {
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_pass http://ca.sise.com.cn:7001/tomcat/;
proxy_set_header Host ca.sise.com.cn:7001;
proxy_set_header X-Forwarded-For $remote_addr;
add_header Set-Cookie 'host=ca.sise.com.cn';
}
location /tomcat {
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_pass http://ca.sise.com.cn:7001/tomcat;
proxy_set_header Host ca.sise.com.cn:7001;
proxy_set_header X-Forwarded-For $remote_addr;
add_header Set-Cookie 'host=ca.sise.com.cn';
}
location / {
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_set_header X-Forwarded-For $remote_addr;
if ( $http_cookie ~ "^(.*www\.sise.com\.cn.*)$")
{
proxy_pass http://www.sise.com.cn;
break;
}
if ( $http_cookie ~ "^(.*ca\.sise.com\.cn.*)$")
{
proxy_pass http://ca.sise.com.cn;
break;
}
}
}
无法显示?
==============华丽分割线20170213修改=============
以下代码在非硬编码情况可以达到虚拟目录转发效果
location /web/ {
auth_basic "Restricted";
auth_basic_user_file htpasswd;
proxy_redirect off ;
proxy_set_header Host $host;
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;
proxy_pass http://localhost:808;
}