2011-07-21 66 views
6

我正在清理我的域的目录结构(我需要在根目录中设置根网址的内容!),需要一些见解关于如何正确使用RewriteRule。.htaccess:重定向根网址到子目录,但保留根网址

要义

我想使用domain.tld使用使用domain.tld /子目录/但仍显示为在URL 使用domain.tld

我的.htaccess到目前为止

Options +FollowSymlinks 
RewriteEngine On 

#Force removal of wwww subdomain 
RewriteBase/
RewriteCond %{HTTP_HOST} ^www.domain.tld 
RewriteRule ^(.*)$ http://domain.tld/$1 [R=301,L] 

#Trailing slash 
RewriteRule ^/*(.+/)?([^.]*[^/])$ http://%{HTTP_HOST}/$1$2/ [L,R=301] 

#Redirect root url to subdirectory 
RedirectMatch 301 ^/subdirectory/$ http://domain.tld/ 
RewriteRule ^/$ /subdirectory/?$ [L] 

的RedirectMatch的伟大工程。不幸的是,t似乎最后的RewriteRule 应该工作就够了,但事实并非如此。根目录中的旧内容设置仍然出现。

我在这里错过了什么?

更新:,我没有足够的经验与htaccess的/阿帕奇解决

简单的解决方法,以便能够解释为什么。

我:

RewriteRule ^/$ /subdirectory/?$ [L] 

取出一个斜杠固定的一切:

RewriteRule ^$ /subdirectory/?$ [L] 

所以现在我的问题是:这是为什么?

回答

0

RewriteRule中的URI部分不包含前面的斜线。

所以要匹配http://example.com/你必须使用RewriteRule ^$其中RewriteRule ^/$理论上将匹配http://example.com//(注意双斜杠)。

其他:?$在最后没有任何意义,因为这会添加一个查询字符串与一个空参数$

最后你:RewriteRule ^$ /subdirectory/ [L,QSA]

0

两个规则VALID

这一个在服务器配置或虚拟主机的上下文中使用URL以斜线开始):

RewriteRule ^/$ /subdirectory/ [L] 

如果您在中放置相同的规则。htaccess的,那么你必须删除前导斜杠(,因为它是相对于当前文件夹):

RewriteRule ^$ /subdirectory/ [L] 

附: Floern已经提到约?$它目标的URL部分。根本不需要$。如果你用?完成你的URL,这告诉Apache不要将查询字符串转移到新的URL(完全丢弃查询字符串)。

此外,[QSA]标志仅在您使用查询字符串(在目标URL中有?)进行操作时才需要,并且仍然希望将当前查询字符串附加到新构建的URL。这意味着在此规则RewriteRule ^$ /subdirectory/ [L,QSA][QSA]标志根本不做任何事情,可以安全地删除。

1

试试这个:

RewriteEngine on 
RewriteBase/

RewriteCond %{REQUEST_URI} !^/subdirectory/ 

# REWRITES ALL URLS 
# [REPLACE "domain" WITH THE ACTUAL DOMAIN, 
# WITHOUT THE TLD (.com, .net, .biz, etc)] 
RewriteCond %{HTTP_HOST} ^(www\.)?domain\. 

# REWRITE ALL THOSE TO subdirectory 
RewriteRule ^(.*)$ /subdirectory/$1 [L] 

BR 斯皮罗斯

相关问题