我有很多网站在同一台机器上运行,由httpd提供服务。每个站点都在不同的子域上设置为VirtualHost。此外,对于每个子域,在不同的端口上有两个VirtualHost:一个用于“稳定”版本,一个用于“beta”版本。稳定版本托管在端口80上。
登录(稳定版本)网站后,如果后端确定用户应使用测试版,则会设置Cookie。
我希望Apache能够在对稳定版本的后续请求中检测到此cookie,并且(在用户不知情的情况下)将请求重定向到测试版。
我怎样才能做到这一点?
我已经尝试在httpd.conf中使用RewriteCond / RewriteRule,但它似乎没有任何影响 - 也许Apache忽略它而支持匹配的VirtualHost,或者对排序很敏感(我认为VirthalHost定义是被列入第一)?也许我应该使用mod_proxy,无论如何?
我已经在
下面添加了(匿名)我的配置片段Listen 80
NameVirtualHost *:80
Listen 81
NameVirtualHost *:81
Include "/path/to/checkout/config/[stage]/apache2/*.conf" # VirtualHosts of sites
Include "/path/to/checkout/config/common/apache2/*.conf" # My attempted redirect
<VirtualHost *:80>
ServerName [app.hostname]
ServerAlias [alternative-app-name.hostname]
DocumentRoot "/var/www-application/release-base/current/app/public"
<Directory "/var/www-application/release-base/current/app/public/">
Options Indexes FollowSymLinks
AllowOverride All
</Directory>
<!-- snip -->
</VirtualHost>
<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]
答案 0 :(得分:1)
你有两个问题:
%{HTTP_HOST}
”var包含端口号,因此您将重定向到http://hostname:80:81/foo
(因此您的“挂起”)为了使其透明,您需要使用RewriteRule上的[P]标志,并包含ProxyPassReverse指令。您的最终指令(在每个'稳定'conf文件中)应如下所示:
RewriteCond %{HTTP_COOKIE} absVersion
RewriteRule ^/(.*) http://hostname:81/$1 [P]
ProxyPassReverse / http://hostname:81/
请注意,这需要启用mod_proxy(以及任何必要的子模块,例如mod_proxy_http)。