使用.htaccess访问网站根目录之外的内容

时间:2017-03-06 16:13:03

标签: apache .htaccess

也许之前已经问过这个问题,但我不知道如何搜索它。所以我有这样的网址:

www.mydomain.com/archive/page.html

域显示到文件夹A,存档子文件夹位于文件夹B中:

/
/A (website root)
/B/archive/page.html

我必须在.htaccess文件中写什么才能使用上述网址?

这样做的目的是在A中安装一个新网站,而不将旧网站的页面放在B中,但仍然需要保存到新的网站文件夹中。

1 个答案:

答案 0 :(得分:1)

情景1

如果AB不在同一个Web根目录下,则需要使用alias并为目标目录定义目录块。这不能在.htaccess文件中完成,但可以在服务器或vhost配置中设置:

Alias "/archive" "/path/to/B/archive"
<Directory "/path/to/B/archive">
    Require all granted
</Directory>

应根据需要添加OptionsAllowOverride指令。

场景2

如果AB是网络根目录/下的子目录,则下面的.htaccess条目应该有效:

RewriteEngine on
RewriteRule ^/?archive(/.*)?$ %{DOCUMENT_ROOT}/B/archive$1 [PT,L]

这也应该通过URL中的任何查询字符串。

已添加:场景3

如果您需要/archive映射到/B/archive,同时允许重写/B/下的文件,则以下配置应该有效。

首先,我们创建别名以将/B映射到Web根目录,使其可以重写规则:

Alias "/B" "/path/to/B"
<Directory "/path/to/B">
    Require all granted
</Directory>

然后我们使用以下重写规则将/archive映射到/B/archive

RewriteEngine on
RewriteRule ^/?archive(/.*)?$ %{DOCUMENT_ROOT}/B/archive$1 [PT,L]

/B中要映射到/的任何其他文件(例如/B/page.html作为/page.html)可以通过添加如下规则来完成:< / p>

RewriteRule ^/?page\.html$ /B/page.html [L]

这几乎结合了场景1和场景2以获得理想的效果。

已添加:方案4

这种情况刚好发生在我身上,但是如果您希望从/B提供的文件已经存在于根文件夹/A中,那么您只需映射不在{{/A内的文件的每个请求。 1}}改为/B

RewriteEngine on
RewriteCond %{REQUEST_URI} !^/B/
RewriteCond %(DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteCond %(DOCUMENT_ROOT}%{REQUEST_URI} !-d
RewriteRule ^.*$ /B%{REQUEST_URI} [PT,L]

这基本上可以做到以下几点:

  • 检查请求是否已从/B开始以防止循环
  • 检查请求是否与文件或目录不匹配
  • 重写请求以/B开头,并提供该资源(如果存在)

这也将处理/archive案件。您仍然需要方案3中的别名。另请注意,如果/A/B中所请求的资源不存在,您仍会获得404 }。