处理同一URL中的多个版本

Ser*_*gio 8 php apache ria multiple-versions

我正在尝试做的是处理同一个Web应用程序的多个版本,有点像谷歌与他们的一些产品,你得到"尝试新版本"链接.

目标是同时拥有webapp的"稳定"版本和"beta"版本,并让用户试用新功能而不必强迫它们(以及它们的错误).

现在,一种非常简单的方法是将每个版本放在自己的子文件夹中,例如www.mywebapp.com/v1和www.mywebapp.com/v2.

但是,我希望这对用户和webapp URL保持透明以保持不变(例如:www.mywebapp.com/).

在用户登录后确定必须加载哪个版本的服务器端(例如:给定用户的活动版本存储在DB中),并且可以在用户点击"尝试新版本"/"go时更改回到旧版本"链接.

在服务器端,我必须使用MySQL,PHP和Apache.

我已经设法让这个工作将每个版本放入它自己的子文件夹,然后将版本信息存储在cookie中(在每次登录或页面刷新时由服务器更新)并使用RewriteRule来"代理"来自base/versionless的请求适当子文件夹的URL.如果未设置cookie,则由后备RewriteRule选择默认文件夹.

这个kludge工作,但感觉非常脆弱,它给Apache守护进程带来了额外的负担所以我在这里问我是否有人知道更好的方法.

谢谢!

cwa*_*ole 6

htaccess允许根据cookie的内容进行重写.由于Apache在重定向方面非常棒且PHP足够,我会这样处理它.

此示例测试是否存在vers cookie.如果有,它会将vers + cookie中的'vers ='+添加到请求中.

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_COOKIE} vers=([^;]+) [NC]
RewriteRule ^(.*)$ /$1?vers=%1 [NC,L,QSA]
Run Code Online (Sandbox Code Playgroud)

(这个例子可以在这里找到)


Mad*_*iha 2

我认为 PHP 中更好的方法是简单地查询数据库,获取所需的版本,然后include()从子文件夹中获取它。这样它对用户来说是透明的。

例如,假设用户选择了新的测试版,您将他的条目保存在数据库中,

UPDATE `versions_table` SET (`version`) VALUES ('1.02b') WHERE `userid` = 5
Run Code Online (Sandbox Code Playgroud)

然后当他访问该页面时,就会发生这样的事情:

//PDO Connection here, skipped for example purposes
$stmt = $pdo->query('SELECT `version` from `versions_table` WHERE `userid` = 5 LIMIT 1'); 
//Of course 5 is only an example, in actual code that would be a variable
//representing the actual user ID.
$row = $stmt->fetch(); //Should be only one row.
include_once($row['version'].'/myApp'.'.php'); //Include 1.02b/myApp.php
Run Code Online (Sandbox Code Playgroud)