基于Apache cookie的透明代理/重定向

基于Apache cookie的透明代理/重定向,apache,mod-rewrite,virtualhost,Apache,Mod Rewrite,Virtualhost,我有许多站点运行在同一台机器上,由httpd提供服务。每个站点都设置为不同子域上的虚拟主机。此外,对于每个子域,在不同的端口上有两个VirtualHost:一个用于“稳定”版本,一个用于“测试”版本。稳定版本托管在端口80上 登录到(稳定版本的)站点后,如果后端确定用户应使用测试版,则会设置cookie 我希望Apache在后续对稳定版本的请求中检测这个cookie,并(在用户不知道的情况下)将请求重定向到beta版本 我怎样才能做到这一点 我曾尝试在httpd.conf中使用RewriteCo

我有许多站点运行在同一台机器上,由httpd提供服务。每个站点都设置为不同子域上的虚拟主机。此外,对于每个子域,在不同的端口上有两个VirtualHost:一个用于“稳定”版本,一个用于“测试”版本。稳定版本托管在端口80上

登录到(稳定版本的)站点后,如果后端确定用户应使用测试版,则会设置cookie

我希望Apache在后续对稳定版本的请求中检测这个cookie,并(在用户不知道的情况下)将请求重定向到beta版本

我怎样才能做到这一点

我曾尝试在httpd.conf中使用RewriteCond/RewriteRule,但似乎没有任何效果-可能Apache为了匹配VirtualHost而忽略了它,或者对排序很敏感(我认为VirtualHost定义是首先包含的)?也许我应该使用mod_代理,无论如何

配置 我在下面包含了我的配置(匿名)片段

httpd.conf config/[stage]/apache2/[site]/apache2/[app stable].conf App.htaccess(如果相关) 你有两个问题:

  • 忽略全局范围内的重定向;将它们移动到vhost范围
  • %{HTTP\u HOST}
    ”变量包含端口号,因此您将重定向到
    http://hostname:80:81/foo
    (因此您的“挂起”)
  • 为了使其透明,您需要在RewriteRule上使用[p]标志,并包含一个ProxyPassReverse指令。您的最终指令(在每个“稳定”配置文件中)应如下所示:

    RewriteCond %{HTTP_COOKIE} absVersion
    RewriteRule ^/(.*) http://hostname:81/$1 [P]
    ProxyPassReverse / http://hostname:81/
    
    请注意,这需要启用mod_proxy(以及任何必要的子模块,例如mod_proxy_http)。

    您有两个问题:

  • 忽略全局范围内的重定向;将它们移动到vhost范围
  • %{HTTP\u HOST}
    ”变量包含端口号,因此您将重定向到
    http://hostname:80:81/foo
    (因此您的“挂起”)
  • 为了使其透明,您需要在RewriteRule上使用[p]标志,并包含一个ProxyPassReverse指令。您的最终指令(在每个“稳定”配置文件中)应如下所示:

    RewriteCond %{HTTP_COOKIE} absVersion
    RewriteRule ^/(.*) http://hostname:81/$1 [P]
    ProxyPassReverse / http://hostname:81/
    

    请注意,这需要启用mod_proxy(以及任何必要的子模块,例如mod_proxy_http)。

    我尝试将cookie cond和重写规则放入稳定vhost,但这似乎会使请求挂起…我尝试将cookie cond和重写规则放入稳定vhost,但这似乎会使请求挂起。。。
    <VirtualHost *:81>
      ServerName [app.hostname]
      ServerAlias [alternative-app-name.hostname]
      DocumentRoot "/var/www-application/beta-release-base/current/app/public"
      <Directory "/var/www-application/beta-release-base/current/app/public/">
         Options Indexes FollowSymLinks
         AllowOverride All
      </Directory>
      <!-- snip -->
    </VirtualHost>
    
    # !!! This has no effect !!!
    RewriteEngine On
    RewriteCond %{HTTP_COOKIE} cookiename
    RewriteCond %{SERVER_PORT} !8081
    RewriteRule ^ https://%{HTTP_HOST}:8081%{REQUEST_URI} [R,L] # (R for debugging)
    
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} -s [OR]
    RewriteCond %{REQUEST_FILENAME} -l [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^.*$ - [NC,L]
    RewriteRule ^.*$ index.php [NC,L]
    
    RewriteCond %{HTTP_COOKIE} absVersion
    RewriteRule ^/(.*) http://hostname:81/$1 [P]
    ProxyPassReverse / http://hostname:81/