Apache mod_rewrite - 将域根转发到子目录

时间:2010-06-13 13:40:06

标签: apache mod-rewrite

我最初认为是一个简单的问题。我正在为我的网站使用共享主机(因此我无法访问Apache配置)并且只有一个文件夹来存储我的所有内容。这一切都很好但是这意味着我所有的子域都必须将他们的虚拟文档根目录放在public_html内,这意味着它们实际上成为我主域中的文件夹。

我想做的是组织我的public_html这样的事情:

public_html/
    www/
        index.php
        ...
    sub1/
        index.php
        ...
    some_library/
        ...

这样,我的所有网络内容仍然在public_html,但只有一小部分内容会提供给客户端。我可以轻松地为所有子域实现此目的,但它是我遇到问题的主要域。

我在.htaccess中创建了一个public_html文件,其中包含以下内容:

Options +SymLinksIfOwnerMatch # I'm not allowed to use FollowSymLinks
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} !^/www [NC]
RewriteRule ^(.*)$ /www/$1 [L]

这非常有效,但由于某些奇怪的原因,www.example.com/stuff被转换为www.example.com/www/stuff请求,因此会给出404错误。我的理解是,除非指定了'R'标志,否则mod_rewrite纯粹是内部的,所以我无法理解为什么生成请求,因为这意味着(至少对我来说)重定向。

我认为这将是一个微不足道的问题需要解决,因为我真正想做的是将www.example.com的根的所有请求转发到子目录,但我花了几个小时搜索答案,没有一个是完全的正确。我发现很难相信我是唯一有这个问题的人。

我很抱歉,如果此问题已在此处得到解答,我会进行搜索和拖网,但无法找到合适的答案。请有人对此有所了解吗?

1 个答案:

答案 0 :(得分:0)

最后我自己解决了这个问题。事实证明,即使删除了.htaccess文件,Apache也会记住文件夹设置。因为我已经玩了这么久,我之前的一些尝试完全污染了配置。

我通过首先评论除了.htaccess之外的所有RewriteEngine off文件来解决它,这使得一切(几乎)恢复正常。然后我通过编写以下配置来设法获得所需的效果:

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteRule ^$   www/   [L]
    RewriteRule (.*) www/$1 [L]
</IfModule>

最后,我在.htaccess目录中创建了另一个www文件,其中包含:

<IfModule mod_rewrite.c>
    RewriteEngine off
</IfModule>

现在一切似乎都像我原来想要的那样起作用。很遗憾,花了这么长时间才完成这一切!