.htaccess将Root重定向到子域

时间:2012-07-18 03:47:27

标签: apache .htaccess

我正在尝试用我当前的共享主机配置修复一些烦恼,但是我遇到了一些问题,因为我想要设置所有内容。

目前,我有以下文件夹结构:

/
/.htaccess
  /example
  /example1
  /example2
  /example3

在共享主机上,主域将自动设置为指向根目录。为了将主域指向子域,我将以下内容添加到我的根文件的.htaccess中:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [L]

RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$
RewriteCond %{REQUEST_URI} !^/example/
#RewriteCond %{REQUEST_FILENAME} !-f
#RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /example/$1
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteRule ^(/)?$ example/ [L]

这会正确地重写URL,以便转到example.com显示/ example /子目录中的内容。问题是根目录的子目录没有以相同的方式重写,这不是我希望实现的功能。例如:

http://www.example.com/            = /example
http://www.example.com/example/    = /example
http://www.example.com/example1/   = /example1
http://www.example.com/example2/   = /example2
http://www.example.com/example3/   = /example3

我想要发生的事情如下:

http://www.example.com/            = /example
http://www.example.com/example/    = /example/example
http://www.example.com/example1/   = /example/example1
http://www.example.com/example2/   = /example/example2
http://www.example.com/example3/   = /example/example3

我对应该发生的事情的理解如下:

  1. 收到http://www.example.com的请求。
  2. 第一个条件无法匹配,HTTP_HOST与^ example.com $
  3. 不匹配
  4. 第二个条件:匹配^ www.example.com
  5. 第三个条件:没有REQUEST_URI,所以它不匹配^ / example /
  6. 第四和第五:我曾尝试过使用和不使用这些,但似乎没有改变结果。我的理解是,如果这些行被取消注释,我会在我现在拥有之前看到不需要的(如果文件名和目录存在,则不会进行重写)。
  7. 将请求重写为example.com/example /
  8. 第六个条件:将URL与特定域匹配。
  9. 始终重写以使用此示例的/ example /子目录。
  10. 这似乎有效,但如果我尝试转到http://www.example.com/example2/,我就会遇到问题。由于REQUEST_URI与/ example /不匹配,我的想法是它应该重写为/ example / example2,但这显然不会发生。

    我无法访问Apache配置或设置VirtualHosts的功能,所以我希望有一些方法可以通过.htaccess规则来实现。任何关于我如何过度复杂化这个简单任务的见解都会非常有帮助。

1 个答案:

答案 0 :(得分:0)

据我所知,root中的.htaccess文件被忽略,如果root中的目录与正在进入的请求匹配(即,如果exam​​ple1存在于根目录中,则重写RewriteCond / example1到错误页面从未被触发过)。

我对此的解决方案最终没有我想象的那么优雅,但似乎有效。希望它可以帮助其他任何偶然发现这个问题的人。

在example1,example2和example3目录中,我修改了.htaccess文件以包含以下内容(根据目录更改example1):

RewriteCond %{HTTP_HOST} ^(www\.)example\.com$ [NC]
RewriteRule ^(.*)$ /example/example1/$1 [L]

这会强制主域提供我为其创建的子目录中的内容,即使根目录中有匹配的目录也是如此。