网站建设、公众号开发、微网站、微商城、小程序就找牛创网络 !

7*24小时服务专线: 152-150-65-006 023-68263070 扫描二维码加我微信 在线QQ

php开发技术团结互助,让我们共同进步!

当前位置:主页 > 技术资讯 > 开发技术 > php开发技术 >

我们的优势: 10年相关行业经验,专业设计师量身定制 设计师一对一服务模式,上百家客户案例! 企业保证,正规流程,正规合作 7*24小时在线服务,售后无忧

Nginx反向代理配置及反向代理泛目录,目录,全站方法

文章来源:网络收集 发布时间:2019-06-17 10:08:58 围观次数:
分享到:

摘要:使用nginx代理dan(sui)是http响应消息写入服务地址或Web绝对路径的情况。 写一个死的服务地址是很少见的,但它偶尔也会发生。 最棘手的是写入web绝对路径,特别是如果绝对路径没有公共前缀

整站反向代理

server {
    listen       80;                                                         
    server_name ***.com;                                               
    location / {
        proxy_pass http://www.***.com/;
        }
}

目录反向代理


 server {
    listen       80;                                                         
    server_name  ***.com;                                               
    location /abc/ {
        proxy_pass http://ip/abc/;
        }
}

有前缀二级泛目录反向代理


 server {
    listen       80;                                                         
    server_name  ***.com;                                               
    location /abc {
        proxy_pass http://ip/abc;
        }
}


使用proxy_redirect命令修改重定向数据包的位置字段。 在该示例中,根路径中的所有URL都将返回给nginx的/ my / path中的用户。 例如,如果服务返回的重定向数据包的位置是/ login,则用户在nginx代理之后接收的数据包的位置字段是/ my / login。 此时,浏览器将跳转到nginx的/ my / login地址进行访问。


  请注意,服务返回的重定向数据包的位置字段有时会填充绝对路径(包括服务的IP /域名和端口)。 有时会填写相对路径。在这种情况下,您需要检查实际情况。


location /my/ {
    proxy_pass http://my_server;
    proxy_set_header Host $host:$server_port;
    proxy_redirect http://my_server/ http://$host:$server_port/my/;
}


重定向消息代理

  即使配置了nginx代理,当服务返回重定向数据包(http代码为301或302)时,重定向的目标URL地址也会放在http响应数据包的标题的位置字段中。 当用户的浏览器收到重定向消息时,它会解析该字段并进行跳转。 此时,新请求消息将直接发送到服务地址而不是nginx地址。 为了使nginx能够拦截此类请求,您必须修改重定向数据包的位置信息。


 location /my/ {
    proxy_pass http://my_server;
    proxy_set_header Host $host:$server_port;
    proxy_redirect / /my/;
}

上面的配置是将my_server服务的根路径下的所有路径代理到nginx地址的/ my / 路径。 当nginx配置只有一个服务器时,可以省略http:// $ host:$ server_port前缀。


  消息数据替换

  使用nginx代理dan(sui)是http响应消息写入服务地址或Web绝对路径的情况。 写一个死的服务地址是很少见的,但它偶尔也会发生。 最棘手的是写入web绝对路径,特别是如果绝对路径没有公共前缀。 例如:


  典型的网页将包含类似的路径,如下所示:


/public:用于静态页面资源,如js脚本/public/js,样式表/public/css,图片/public/img等。

/static:和/public类似。

/api:用于后台服务API接口。

/login:用于登录验证。

其他。

对于这样的服务,可能的代理配置如下:

 location /my/ {
    proxy_pass http://my_server/;
    proxy_set_header Host $host:$server_port;
    proxy_redirect / /my/;
}
location /login/ {
    proxy_pass http://my_server/public;
    proxy_set_header Host $host:$server_port;
}
location /public/ {
    proxy_pass http://my_server/public;
    proxy_set_header Host $host:$server_port;
}
location /api/ {
    proxy_pass http://my_server/api;
    proxy_set_header Host $host:$server_port;
}

由于web页面或静态资源内写死了类似的绝对路径,那么对于用户来说,通过页面内的链接进行跳转时,都会请求到nginx服务对应的路径上。一旦存在另一个服务也包含类似的路径,也需要nginx进行代理,那么矛盾就出现了:访问nginx的同一个路径下的请求究竟转发给哪一个服务?


要解决这个问题,必须在用户收到报文前,将报文的数据中包含的绝对路径都添加统一的前缀,如/my/public,/my/api,/my/login,这样nginx代理配置则可以简化为:

 location /my/ {
    proxy_pass http://my_server/;
    proxy_set_header Host $host:$server_port;
    proxy_redirect / /my/;
}
location /other/ {
    proxy_pass http://other_server/;
    proxy_set_header Host $host:$server_port;
    proxy_redirect / /other/;
}

nginx的ngx_http_sub_module模块提供了类似的报文数据替换功能,该模块默认不会安装,需要在编译nginx时添加–with-http_sub_module参数,或者直接下载nginx的rpm包。


使用sub_filter对数据包进行替换的语法如下:


location /my/ {
    proxy_pass http://my_server/;
    proxy_set_header Host $host:$server_port;
    
    sub_filter 'href="/' 'href="/my/';
    sub_filter 'src="/' 'src="/my/';
    sub_filter_types text/html;
    sub_filter_once  off;
}

上面的配置用/ my /下的所有响应消息替换href =“/,用href =”/ my,src =“/用src =”/ my,这为所有绝对路径添加了一个公共前缀。


  请注意,如果需要配置多个sub_filters,则必须确保nginx高于1.9.4版。 即便如此,sub_filter也无法解决所有问题。 当前流行的js框架将具有自动呈现URL的功能。 也就是说,许多绝对路径不是写在静态页面中,而是由js代码框架动态生成。 在这种情况下,sub_filter是无能为力的。 对于这种情况,作者只能真诚地建议,或者悄悄改变代码!


本文由 网络收集 整理发布,转载请保留出处,内容部分来自于互联网,如有侵权请联系我们删除。

相关热词搜索:Nginx 反向代理 泛目录 反向代理配置

上一篇:微擎安装使用技巧-微擎安装的时候页面显示空白是怎么回事?
下一篇:phpcmsv9.6.3 后台拿webshell的几种方法及安全漏洞分析

热门资讯

鼠标向下滚动