.htaccess帮助:RewriteRule整个网站

时间:2012-09-09 22:38:15

标签: regex .htaccess mod-rewrite

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

整个网站都将在此文件夹结构中: /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 个答案:

答案 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等。