我最近在其生产环境中推出了一个网站。
整个网站都将在此文件夹结构中: /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
这可能是完全错误的。这甚至可能吗?
欢迎所有帮助。
非常感谢,
丹
答案 0 :(得分:0)
如果您真的希望“所有流量”都使用新版本,我不会使用.htacess文件,而是使用符号链接。在root中你有一个'release'链接指向v1。像这样创建
ln -s /root/v1 /root/released
将您的虚拟主机指向已释放状态。如果要切换,请执行一行命令:
rm -rf /root/released; ln -s /root/v2 root/released
答案 1 :(得分:0)
如何在apache虚拟主机配置(DocumentRoot)中配置它?
答案 2 :(得分: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%确定它会起作用。
答案 3 :(得分: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
等。