我们需要支持少量主要和次要版本的网络服务,因此我们决定在网址中使用这样的版本:
http://service/ # last deployed version of service http://service/1/ # symlink that points to the last deployed major version 1.x http://service/1.2/ # symlink that points to the last deployed minor version 1.2.x
我们将所有标签存储在文件夹中,并使符号链接到正确的版本:
Here the root directory for apache: lrwxr-xr-x 1 xxxx xxxx 28 May 23 15:21 1 -> /home/site/tags/20120523084844-HEAD lrwxr-xr-x 1 xxxx xxxx 28 Apr 27 15:21 1.1 -> /home/site/tags/20120427152123-HEAD lrwxr-xr-x 1 xxxx xxxx 28 May 23 08:48 1.2 -> /home/site/tags/20120523084844-HEAD lrwxr-xr-x 1 xxxx xxxx 28 May 24 16:12 2 -> /home/site/tags/20120524161232-HEAD (source code here for last deployed version) .....
这里有一个问题,因为我们在PHP的REQUEST_URI中会有版本前缀,而Symfony路由器与模式不匹配。我们如何剪切该版本前缀,但仍然使用特定目录作为文档根目录?
例如,当我们向http://service/1.2/some/handler/pattern
发出请求时,将使用来自1.2目录的代码,而PHP中的REQUEST_URI将是/ some / handler / pattern
答案 0 :(得分:1)
试试这个:
RewriteEngine On
RewriteBase /
RewriteCond $1 !^[0-9.]+/
RewriteRule ^(.*) /1.2/$1 [L]
唯一的想法是你一次只能测试版本,如果你想要一个不同的版本,就必须更改htaccess。
我建议使用子域进行版本控制吗?
答案 1 :(得分:1)
这是一个有趣的问题。
我不认为只能使用htaccess,至少不会没有丑陋的黑客。 REQUEST_URI总是保存原始请求,据我所知,没有办法编辑它(如果我们尝试通过E = REQUEST_URI =“something”将内容分配给变量REQUEST_URI,那么将创建一个名为“REDIRECT_REQUEST_URI”的环境变量)。
我不熟悉Symfony,所以我不知道编辑处理路由的脚本是多么容易。如果这很容易,你可以做类似
的事情RewriteRule ^[1-9.]/(.*)$ - [R,QSA,NC,E=HANDLER:$1]
然后在PHP中你可以将处理程序复制到request_uri:
$_SERVER['REQUEST_URI'] = $_SERVER['REDIRECT_HANDLER'];
除了像这样更改PHP之外,我只能想到这一点:首先硬重定向到处理程序,将版本信息放在查询字符串中。然后捕获该请求,并软重定向到版本/处理程序。 Request_uri将被正确设置,但它很丑陋并且非常容易出错。
那就是说,我完全同意Gerben关于使用子域进行版本控制的问题。