【问题标题】:.htaccess help: RewriteRule entire website.htaccess 帮助:重写整个网站
【发布时间】:2012-09-02 20:10:05
【问题描述】:

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

整个网站将采用以下文件夹结构: /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

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

欢迎所有帮助。

非常感谢,

【问题讨论】:

    标签: regex .htaccess mod-rewrite


    【解决方案1】:

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

    ln -s /root/v1 /root/released
    

    将您的虚拟主机指向已释放。当你想切换时,执行一行命令:

    rm -rf /root/released; ln -s /root/v2 root/released
    

    【讨论】:

    • 不幸的是,我在共享服务器上,据我所知(我可能是错的)我没有更改它的权限,它们都是预设的。
    • @DanielBeddows 您是否可以访问上述 scott 提到的虚拟主机配置?
    • 我会试一试并发布我的结果,非常感谢。编辑:我认为这会导致问题,我有几个网站托管在同一个用户下,不会影响每个网站吗?
    【解决方案2】:

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

    【讨论】:

    • 我在共享服务器上,据我所知,我无权访问配置。虽然我被引导相信我可以使用 shell。
    【解决方案3】:

    如果您需要在 .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% 确定它会起作用。

    【讨论】:

      【解决方案4】:

      在文档根目录的 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. 之后的任何匹配项。所以如果网址是:

      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

      【讨论】:

      • 这似乎有效。我很抱歉,但是否可以重写它以在 website.com 和任何子域下工作?或者这不可行?非常感谢。
      • 不幸的是,这不起作用,但这是我想要的解决方案类型。是否可以重写它以在子域上工作?
      猜你喜欢
      • 2010-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多