2

我最近在其生产环境中启动了一个网站。

整个网站将位于以下文件夹结构中:/root/v1/website.com/index.php

我需要的帮助是 .htaccess。当我升级环境时,我需要 0 次停机时间,所以我想在一个名为 /root/v2/website.com/index.php 的文件夹中制作网站的下一个版本,并且可以立即切换。

基本上是“翻转开关”,通过将所有流量发送到当前版本中的相应文件夹。

例如,现在,我希望来自http://www.website.com/cookies/aregreat.php的所有流量在以下位置打开:/root/v1/website.com/cookies/aregreat.php

这也适用于图像、js 和 css 文件

然后我显然可以从 .htaccess 中更改版本,其余的将自行解决。

我不熟悉 RewriteRule 并且我对正则表达式不太熟悉,我最接近解决问题的是:

RewriteEngine on
RewriteRule (.*) /../v1.0.0/$1

这可能是完全错误的。这甚至可能吗?

欢迎所有帮助。

非常感谢,

4

4 回答 4

0

如果您真的希望“所有流量”使用新版本,我不会为此使用 .htacess 文件,而是使用符号链接。在 root 中,您将拥有一个指向 v1 的“已发布”链接。像这样创建它

ln -s /root/v1 /root/released

将您的虚拟主机指向已发布。当您想切换时,请执行一行命令:

rm -rf /root/released; ln -s /root/v2 root/released
于 2012-09-09T22:50:04.497 回答
0

如何在您的 apache 虚拟主机配置(DocumentRoot)中配置它?

于 2012-09-09T22:51:51.193 回答
0

如果您需要在 .htaccess 中执行此操作,请尝试以下操作:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^domainname.com$ [NC,OR]
RewriteCond %{HTTP_HOST} ^www.domainname.com$
RewriteCond %{REQUEST_URI} !folderV2/
RewriteRule (.*) /folderV2/$1 [L]

注意:我没有对此进行测试,我不能 100% 确定它会起作用。

于 2012-09-09T22:59:50.687 回答
0

在文档根目录的 htaccess 文件中(应该是 n /root/.htaccess):

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/v[0-9.]+/website.com
RewriteRule ^(.*)$ /v1/website.com/$1 [L]

您只需将其更改为v1您拥有的任何版本并保存文件,然后您就可以翻转开关。


不幸的是,这不起作用,但这是我想要的解决方案类型。是否可以重写它以在子域上工作?

%{HTTP_HOST}是的,您可以使用%符号匹配和反向引用:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www\.)?(.*)$ [NC]
RewriteCond %{REQUEST_URI} !^/v[0-9.]+/%2
RewriteRule ^(.*)$ /v1/%2/$1 [L]

在这里,%2将是可选后的任何匹配项www.。因此,如果 URL 是:

http://www.domain.com/cookies/aregreat.php

然后你应该被重写为/v1/domain.com/cookies/aregreat.php, 并且:

http://cakes.domain.com/chocolate/cake.php

应该被重写为/v1/cakes.domain.com/chocolate/cake.php等。

于 2012-09-09T23:00:06.543 回答