Web服务器根据url参数代理

根据url参数代理到不同的虚拟主机中
TIP:正向代理、反向代理以及url重写

  • 正向代理:正向代理是一个位于客户端和目标服务器之间的代理服务器(中间服务器)。为了从原始服务器取得内容,客户端向代理服务器发送一个请求,并且指定目标服务器,之后代理向目标服务器转交并且将获得的内容返回给客户端。
  • 反向代理:反向代理正好相反。对于客户端来说,反向代理就好像目标服务器。并且客户端不需要进行任何设置。客户端向反向代理发送请求,接着反向代理判断请求走向何处,并将请求转交给客户端,使得这些内容就好似他自己一样,一次客户端并不会感知到反向代理后面的服务,也因此不需要客户端做任何设置,只需要把反向代理服务器当成真正的服务器就好了。
  • url重写:url重写就是首先获得一个进入的URL请求然后把它重新写成网站可以处理的另一个URL的过程。举个例子来说,如果通过浏览器进来的URL是“UserProfile.aspx?ID=1”那么它可以被重写成 “UserProfile/1.aspx”,这样的URL,这样的网址可以更好的被网站所阅读。

url为:https://domain/1915/?c=user&a=Add
需求:根据?后的c=user&a=Add进行匹配,从而进入不同的虚拟主机中
注意:此处url中的1915是authid,authid是动态生成,所以需要考虑到该问题(使用正则解决即可)。

apache

实现技术:使用了apache的RewriteRule重定向到指定的url中,具体配置如下:

# Python配置

WSGIPythonHome /usr/local/python3
<VirtualHost *:9052>
    SSLEngine on
    SSLCertificateFile "/usr/local/mawbd/conf/server.crt"
    SSLCertificateKeyFile "/usr/local/mawbd/conf/server.key"
    
    WSGIScriptAlias / /yourpath
    <Directory /yourpath>
        AllowOverride None
        Order allow,deny  
        Allow from all  
        Options All
        Require all granted 
    </Directory>
</VirtualHost>

# 反向代理(python)
<VirtualHost *:443>
    SSLEngine on
    SSLCertificateFile "/yourpath"
    SSLCertificateKeyFile "/yourpath"
    <FilesMatch \.php$>
        SetHandler "proxy:fcgi://127.0.0.1:9000"
    </FilesMatch>

    DocumentRoot "/yourpath"                    
    <Directory "/yourpath">
        Options FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>     
    # 开启反向代理ssl模块
    SSLProxyEngine on
    SSLProxyCheckPeerCN Off
    SSLProxyCheckPeerName Off
    Proxyrequests off
    # 以下为配置重定向到Python中
    RewriteEngine on  # 开启rewrite功能
    RewriteCond %{REQUEST_URI} ^/[0-9]{1,4} #根据请求的url正则匹配1-4位字符
    RewriteCond %{QUERY_STRING} ^c=(user&a=Add*) #根据?后的参数进行匹配
    RewriteRule ^(.*) https://127.0.0.1:9052/1234/ [P]   #[p] 为反向代理
</VirtualHost>

nginx

实现技术:使用了nginx的$request_uri 进行正则匹配

location ~ \.php {
            root   htdocs;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            include        fastcgi_params;
            set $real_script_name $fastcgi_script_name;
            if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
                set $real_script_name $1;
                set $path_info $2;
            }
            # 以下为重定向到Python中
            if ($request_uri ~* /\d+/\?c\=user\&a=Add){ #进行正则匹配
                proxy_pass https://127.0.0.1:9001/$request_uri; #反向代理到Python中
                break;
            }
            fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
            fastcgi_param SCRIPT_NAME $real_script_name;

            fastcgi_param PATH_INFO $path_info;
        } 
    }

lighttpd

实现技术:通过lighttpd服务器反向代理技术,对整体请求进行二次识别,对url识别后,使用函数对参数进行识别,从而根据不同的url以及参数的变量进入到Python中,从而实现PHP+Python

$SERVER["socket"] == "0.0.0.0:443" { 
    ssl.engine = "enable"
    ssl.pemfile = "/yourpath"
    ssl.ca-file = "/yourpath"
    server.document-root = "/yourpath" 
    $HTTP["url"] =~ "/" {
        
        fastcgi.server = ( 
            ".php" => (( 
            "host" => "127.0.0.1", 
            "port" => "9000" 
                        ))),  

                
        $HTTP["querystring"] =~ "^/?c=user&a=Add"{
            proxy.server = (
                "" => ((
                    "host" => "127.0.0.1",
                    "port" => 9088
                )))
            }
        }
    url.rewrite-once = (
        "^/(\d*)/(.*)$" => "/$2&authid=$1",
    )
}

# python 虚拟主机
$SERVER["socket"] == "0.0.0.0:9088"{
    # lighttpd官方文档提示,所被代理的服务器不支持SSL
        # ssl.engine = "enable"
        # ssl.pemfile = "/yourpath"
        # ssl.ca-file = "/yourpath"
        server.document-root = "/yourpath"
        $HTTP["url"] !~ "^/static" {
            fastcgi.server = ("/" => 
                ((
                    "socket" => "/tmp/myapp-fcgi.sock",
                    "bin-path" => "/yourpath",  
                    "check-local" => "disable",
                    "max-procs" => 1
                ))
        )
        # alias.url=("/"=>"/")
        # here Solve the problem of URL redundant parameters
         url.rewrite-once  = (
        "^/(.*)&authid=(\d*)$"=>"/runapp.fcgi/$2/$1",   # 这里将url重写进行写回
         )
    }
}

lighttpd官方文档解释如下:


image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,519评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,842评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,544评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,742评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,646评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,027评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,513评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,169评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,324评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,268评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,299评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,996评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,591评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,667评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,911评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,288评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,871评论 2 341

推荐阅读更多精彩内容