3

我们需要支持几个主要和次要版本的 web 服务,所以我们决定在 URL 中使用这样的版本:

http://service/ # 上次部署的服务版本
http://service/1/ # 指向最后部署的主要版本 1.x 的符号链接
http://service/1.2/ # 指向最后部署的次要版本 1.2.x 的符号链接

我们将所有标签存储在文件夹中,并将符号链接到正确的版本:

这里是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
(此处为上次部署版本的源代码)
......

这里有一个问题,因为我们将在 PHP 的 REQUEST_URI 中有版本前缀,而 Symfony 路由器不会将它与模式匹配。我们怎样才能削减那个版本前缀,但仍然使用特定目录作为文档根目录?

例如,当我们向http://service/1.2/some/handler/pattern1.2 目录中的 then 代码发出请求时,PHP 中的 REQUEST_URI 将是 /some/handler/pattern

4

2 回答 2

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 关于使用子域进行版本控制的观点。

于 2012-05-25T19:59:02.250 回答
1

尝试这个:

RewriteEngine On
RewriteBase /

RewriteCond $1 !^[0-9.]+/
RewriteRule ^(.*) /1.2/$1 [L]

唯一的想法是您一次只能测试版本,如果您想要不同的版本,则必须更改 htaccess。

我可以建议使用子域进行版本控制吗?

于 2012-05-25T19:33:59.760 回答