如何从请求URI中删除版本前缀并使用正确的文档根?

时间:2012-05-25 06:08:22

标签: php apache .htaccess mod-rewrite

我们需要支持少量主要和次要版本的网络服务,因此我们决定在网址中使用这样的版本:

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

2 个答案:

答案 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关于使用子域进行版本控制的问题。