使用RewriteRule寻找RewriteBase等价物

时间:2015-12-20 00:10:32

标签: apache mod-rewrite

我面临Apache配置问题,可以总结如下。

  1. 在一个独特的托管系统上,我有很多不同的测试站点,每个站点都在自己的子目录中,因此可以通过myhostname.fr/sitename等网址访问它们。 因此,在相应的.htaccess中,通常的做法是在任何RewriteBase /sitename + RewriteCond集之前设置RewriteRule,并且工作正常。
  2. 现在,对于其中一个网站(例如在specialsite子目录中),我必须创建一个专用域,因此网址看起来像domainname.myhostname.fr。 然后,要使此网站正常运行,.htaccess现在需要RewriteBase /而不是RewriteBase /specialsite,它也能正常运作。
  3. 以下是诀窍:对Apache不熟悉我决定尝试并希望 继续通过公共网址myhostname.fr/specialsite访问此网站。
  4. 所以我必须找到一种方法来有条件地使用上述RewriteBase之一,具体取决于当前网址。

    我尝试的第一种方式是这样工作:

    <If "%(HTTP_HOST) =~ domainname\.myhostname\.fr">
      RewriteBase /
    </If>
    <If "%(HTTP_HOST) =~ myhostname\.fr/specialsite">
      RewriteBase /specialsite
    </If>
    

    但是我收到了HTTP 500错误,我花了很多时间才明白从Apache 2.4开始就可以使用<If>指令,而我的主机只提供Apache 1.3!

    所以(感谢其他一些SO答案)我想到了另一种方式,首先要做的是:

    RewriteCond %{HTTP_HOST} domainname\.myhostname\.fr
    RewriteRule ^ - [E=VirtualRewriteBase:/]
    
    RewriteCond %{HTTP_HOST} myhostname\.fr/specialsite
    RewriteRule ^ - [E=VirtualRewriteBase:/specialsite/]
    

    然后将所有进一步的RewriteRule替换为给定的VirtualRewriteBase,如下所示:

    RewriteRule ^ %{ENV:VirtualRewriteBase}index.php [L]
    

    但是虽然它适用于域访问版本,但它为子目录访问版本提供了HTTP 404错误。
    因此,为了观察更换的应用方式,我改变了上述规则:

    RewriteRule ^ %{ENV:VirtualRewriteBase}index.php [R,L]
    

    我发现重定向的网址看起来像这样:

    http://myhostname.fr/kunden/homepages/7/d265580839/htdocs/specialsite/index.php
    

    其中kunden/homepages/7/d265580839/htdocs/是我托管的完整文档根。
    您可以注意到文档根已经插入原始URL的两个部分之间 而且,无论我在/specialsite/中代替VirtualRewriteBase,结果都完全一样!

    所以这是我的主要问题:为什么以及如何发生这种情况?
    此外,我显然对可能的替代解决方案感兴趣,以实现双重访问可用性 但最重要的是我想了解......

0 个答案:

没有答案