2010-01-10 99 views
4

我想让我的主域名从一个子目录托管(已经完成了这一步),也就是说,当某人在www.example.com/news后面输入时,它将转到www.example.com /子目录/新闻,但仍将显示为www.example.com/news。微妙的htaccess问题。我要疯了

我用下面的代码BlueHost的做到这一点:

RewriteEngine on 

RewriteCond %{HTTP_HOST} ^(www.)?example.com$ 
RewriteCond %{REQUEST_URI} !^/subdirectory/ 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ /subdirectory/$1 

RewriteCond %{HTTP_HOST} ^(www.)?example.com$ 
RewriteRule ^(/)?$ subdirectory/index.php [L] 

此代码的工作,如果我在www.example.com/news/(注意尾随斜线)类型,但是没有工作,如果我只是请输入www.example.com/news(不带斜杠)。任何想法为什么?

谢谢。

+0

你有一个名为'news'的实际目录可能有冲突吗? – Skilldrick 2010-01-10 18:43:38

+0

不,我的所有文件夹都位于名为public的子目录中。这里是一般结构: maindomain有两个子文件夹(应用程序和公共)。在公共场所有子文件夹,称为新闻,术语表,关于,等等。 所以没有实际www.maindomain.com/news,只有www.maindomain.com/public/news – Robert 2010-01-10 19:08:42

+0

此外,为了澄清,如果我输入www.mymaindomain.com/news它的作品在于它显示的页面在www.mymaindomain.com/public/news,但它也显示公众的URL路径。 – Robert 2010-01-10 19:21:33

回答

0

不是一个真正的回答你的问题,但不会是更容易

  • 更改了DocumentRoot为公共目录,或者如果你不能做到这一点(如共享主机上)。 ..
  • 把公共文件放在你的文档根目录(public_html或任何它被称为的)和应用程序文件在其外部(或者如果你不能超越文档根目录,在它内部但保护网络访问与Deny from all
+0

是的,我认为第二种选择是我必须做的,如果我不能得到这个工作,谢谢你的提示。我会再尝试一两天的尝试,并实施,如果失败:) – Robert 2010-01-11 15:35:30

1

我觉得这个问题是在Apache将/ news重新写入/子目录/新闻之后,它会发现自己的请求与文件系统上的目录匹配,而该目录不会以尾部斜线结尾。所以它发出一个重定向到一个新的url,包括尾部的斜线。

事情是,我们确实希望添加traling slash来保留规范的url(否则我们会以/ news和/ news /导致相同的地方结束 - 对相对链接,SEO等不利)。 ),只是不太像apache所做的那样。因此,我们必须自己做,加入以下内容:

RewriteCond %{REQUEST_URI} ^/subdirectory/.*[^/]$ 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^subdirectory/(.*)$ /$1/ [L,R=301] 

此规则的条件将匹配以“子目录”开头,DO匹配的fielsysem一个目录,但不以trainling结束的任何请求削减。 (例如'/子目录/新闻')。然后,重写过程发出一个永久重定向到同一个路径,但以斜线结尾并剥去'subdiretcory'(例如'/ news /')。

然后客户端会发出'/ news /'的请求,apache会将其重写到/子目录/ news /并且不会发出重定向,因为它以斜杠结束。

快速测试了这一点,它似乎在伎俩。

0

andrewmabbott是对的,并且要解决它,您需要使用ProxyPassReverse。这将重写所有重定向以使用正确的地址。

这样做会是这样的最简单的方法:

ProxyPassReverse /subdirectory http://www.example.com/ 

然而BlueHost的可能已禁用mod_proxy的,在这种情况下,这是不行的。