方案1
如果A
和B
是不一样的Web根目录下,你将需要使用一个alias,并定义为目标目录的目录块。这不能在.htaccess文件来完成,但可以在服务器或虚拟主机配置中设置:
Alias "/archive" "/path/to/B/archive"
<Directory "/path/to/B/archive">
Require all granted
</Directory>
的Options
和AllowOverride
指令应根据需要增加。
方案2
如果A
和B
的Web根目录下/
子目录,然后下面的.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/page.html
担任/page.html
)的任何其他来自/B
的文件都可以通过添加如下规则来完成ing:
RewriteRule ^/?page\.html$ /B/page.html [L]
这几乎结合了场景1和场景2以获得所需的效果。
新增:方案4
这只是发生在我身上,但如果你想从/B
送达的文件不会在根文件夹/A
已经存在,你可以只用于映射文件的每个请求不/A
到/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
。
谢谢你的回答!对我来说情景1是相关的。如果'/ archive'不是文件夹而是文件?所以例如'page.html'在B的根目录下,但必须用'mydomain.com/page.html'访问? – 0711master
所以有'B'下的文件,你想访问而不需要'/ archive'前缀?在这种情况下,如果只有一个或两个文件,您可以为每个文件添加一个规则,例如:'RewriteRule^/?page \ .html $ /B/page.html [L]'。如果你想要做很多文件,那会很乏味。你是否试图重定向一组具有相同扩展名或相同文件前缀的文件?在这种情况下,正则表达式匹配可能会有所帮助。 – AfroThundr
这只是大约15个HTML和PHP文件,所以没有太多的努力......嗯,但是你之前写过,只有当A和B在同一个Web根目录下时,重写规则才有可能,它们不在我的情况... – 0711master