• Nginx HTTP User_agent


    假设我这里有大量图像、CSS、javascript等静态文件,分别放在后端服务器  192.168.1.5 和 192.168.1.6上,那么我如何利用nginx的反向代理功能将不同的 http_user_agent 请求发送到指定的服务器上呢?如 "Mozilla" 转发到 192.168.1.5 ,MSIE  转发到 192.168.1.6 。


    Nginx web 服务器支持if条件表达式,由此来跳转或者使用不同的配置变量。在本文中需要使用 $http_user_agent 变量,它标记了用户浏览器的类别,版本以及操作系统的一些信息

    [html] view plaincopy
     
    1. if ( condition ){  
    2.   do_something  
    3. }  
    4. if ( $http_user_agent = "wget" ){  
    5.    do_something  
    6. }  
    7. if ( $http_user_agent ~ MSIE ){  
    8.    return 403;  
    9. }  


    if指令会就检查后面表达式的值是否为真(true),如果为真,则执行后面大括号中的内容。以下是一些条件表达式的比较方法:
    1、变量的完整比较可以使用=或!=操作符
    2、 部分匹配可以使用正则表达式来表示,~或~*
    3、~表示区分大小写
    4、~*表示不区分大小写(firefox与FireFox是一样的)
    5、!~与!~* 是取反操作,也就是不匹配的意思
    6、检查文件是否存在使用 -f 或 !-f 操作符
    7、检查目录是否存在使用-d或!-d操作符
    8、检查文件,目录或符号连接是否存在使用-e或!-e操作符
    9、检查文件是否可执行使用-x或!-x操作符
    10、正则表达式的部分匹配可以使用括号,匹配的部分在后面可以用$1~$9变量代替,这些和apache一致。


    例子:


    编辑 /usr/local/nginx/conf/nginx.conf 文件
    #vi /usr/local/nginx/conf/nginx.conf
    设置upstream服务器:

    [html] view plaincopy
     
    1. upstream myproxybackend  {  
    2.        server 192.168.1.1;  
    3.        server 192.168.1.2;  
    4.        server 192.168.1.3;  
    5.        server 192.168.1.4;  
    6. }  
    7.    
    8. upstream msiebackend  {  
    9.        server 192.168.1.6;  
    10. }  
    11.    
    12. upstream mozillabackend  {  
    13.        server 192.168.1.5;  
    14. }  


    更新虚拟主机配置文件

    [html] view plaincopy
     
    1. server {  
    2.       access_log  logs/access.log;  
    3.       error_log   logs/error.log;  
    4.       index       index.html;  
    5.       listen      202.54.1.5:80 default;  
    6.       root        /usr/local/nginx/html;  
    7.       server_name example.com www.example.com 0.example.com;  
    8.    
    9.      ## PROXY - Web  
    10.       location / {  
    11.         proxy_pass  http://myproxybackend;  
    12.         if ($http_user_agent ~ MSIE ) {  
    13.               proxy_pass  http://msiebackend;  
    14.         }  
    15.         if ($http_user_agent ~ Mozilla ) {  
    16.               proxy_pass  http://mozillabackend;  
    17.         }  
    18.    
    19.         proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;  
    20. # many more...  
    21. # many more...  
    22. }  


    最后重启/重新载入nginx

    [html] view plaincopy
     
      1. #/usr/local/nginx/sbin/nginx -s reload  
  • 相关阅读:
    c# 使用MySql的MySqlBulkCopy 出现异常 Loading local data is disabled; this must be enabled on both the client and server sides
    DB2 使用EF Core 查询数据 报错 Object reference not set to an instance of an object.
    关于iis部署的网站访问类型设置
    ABP put与delete类型请求异常 TypeErorr: Failed to fetch
    This request has been blocked; the content must be served over HTTPS.
    Mysql Select的字段必须包含在Group By中如何解决
    企业微信小程序-临时登录凭证校验(code2Session)中获取的userid是加密的
    ABP System.ObjectDisposedException: Cannot access a disposed object.
    SQL server数据库文件(mdfldf)的迁移
    A second operation started on this context before a previous operation completed--ABP
  • 原文地址:https://www.cnblogs.com/jouny/p/4134710.html
Copyright © 2020-2023  润新知