也许之前已经问过这个问题,但我不知道如何搜索它。所以我有这样的网址:
www.mydomain.com/archive/page.html
域显示到文件夹A,存档子文件夹位于文件夹B中:
/
/A (website root)
/B/archive/page.html
我必须在.htaccess文件中写什么才能使用上述网址?
这样做的目的是在A中安装一个新网站,而不将旧网站的页面放在B中,但仍然需要保存到新的网站文件夹中。
答案 0 :(得分:1)
情景1
如果A
和B
不在同一个Web根目录下,则需要使用alias并为目标目录定义目录块。这不能在.htaccess文件中完成,但可以在服务器或vhost配置中设置:
Alias "/archive" "/path/to/B/archive"
<Directory "/path/to/B/archive">
Require all granted
</Directory>
应根据需要添加Options
和AllowOverride
指令。
场景2
如果A
和B
是网络根目录/
下的子目录,则下面的.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
}。