2017-03-06 60 views
1

也许这个问题以前已经问过,但我不知道如何搜索它。所以我有这样的URL:使用.htaccess访问网站根外的内容

www.mydomain.com/archive/page.html 

域被显示到文件夹,归档子文件夹是文件夹B:

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

我有什么在.htaccess文件中写入能够使用上面的URL?

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

回答

1

方案1

如果AB是不一样的Web根目录下,你将需要使用一个alias,并定义为目标目录的目录块。这不能在.htaccess文件来完成,但可以在服务器或虚拟主机配置中设置:

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

OptionsAllowOverride指令应根据需要增加。

方案2

如果AB的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

+0

谢谢你的回答!对我来说情景1是相关的。如果'/ archive'不是文件夹而是文件?所以例如'page.html'在B的根目录下,但必须用'mydomain.com/page.html'访问? – 0711master

+0

所以有'B'下的文件,你想访问而不需要'/ archive'前缀?在这种情况下,如果只有一个或两个文件,您可以为每个文件添加一个规则,例如:'RewriteRule^/?page \ .html $ /B/page.html [L]'。如果你想要做很多文件,那会很乏味。你是否试图重定向一组具有相同扩展名或相同文件前缀的文件?在这种情况下,正则表达式匹配可能会有所帮助。 – AfroThundr

+0

这只是大约15个HTML和PHP文件,所以没有太多的努力......嗯,但是你之前写过,只有当A和B在同一个Web根目录下时,重写规则才有可能,它们不在我的情况... – 0711master