Apache .htaccess:将根url重定向到子目录,但保留根url
我正在清理我的域的目录结构(在根目录中设置根url的内容对我来说太糟糕了!),需要了解如何正确使用重写规则 要点 我希望domain.tld使用domain.tld/subdirectory/,但在url中仍显示为domain.tld 迄今为止我的.htaccessApache .htaccess:将根url重定向到子目录,但保留根url,apache,.htaccess,mod-rewrite,Apache,.htaccess,Mod Rewrite,我正在清理我的域的目录结构(在根目录中设置根url的内容对我来说太糟糕了!),需要了解如何正确使用重写规则 要点 我希望domain.tld使用domain.tld/subdirectory/,但在url中仍显示为domain.tld 迄今为止我的.htaccess Options +FollowSymlinks RewriteEngine On #Force removal of wwww subdomain RewriteBase / RewriteCond %{HTTP_HOST} ^w
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]
比赛进行得很好。不幸的是,最后一条重写规则似乎应该足够简单,但事实并非如此。根目录中的旧内容设置仍然显示
我错过了什么
更新:已解决
这是一个简单的修正,我对.htaccess/apache的经验不足,无法解释原因
我有:
RewriteRule ^/$ /subdirectory/?$ [L]
删除一条斜线修复了所有问题:
RewriteRule ^$ /subdirectory/?$ [L]
现在我的问题是:为什么会这样?重写规则中的URI部分不包含前面的斜杠 所以要匹配
http://example.com/
您必须使用重写规则^$
其中重写规则^/$
理论上匹配http://example.com//
(注意双斜杠)
附加:?$
结尾没有任何意义,因为这将添加一个带有空参数$
的查询字符串
最后您有:
RewriteRule^$/subdirectory/[L,QSA]
这两个规则都是有效的:
这个用于服务器配置或虚拟主机上下文中(URL以斜杠开头):
如果在.htaccess中放置相同的规则,则必须删除前导斜杠(因为它是相对于当前文件夹的):
p.S.
Floern已经提到了?$
它的目标URL部分。根本不需要$
。如果您使用?
完成URL,这会告诉Apache不要将查询字符串转移到新URL(完全删除查询字符串)
此外,仅当您使用查询字符串(目标URL中有?
)进行操作并且仍希望将当前查询字符串附加到新生成的URL时,才需要[QSA]
标志。这意味着在此规则中,RewriteRule^$/subdirectory/[L,QSA]
标记完全不起作用,可以安全地删除。尝试以下操作:
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]
溴
Spiros我尝试了解决方案,但在我的例子中,删除了/folder/,但显示了旧站点(www.site.it),而不是删除了“folder”的www.site.it/folder/。。。我复制并粘贴了相同的代码,但在我的案例中不起作用:(我打开了一个新主题:
RewriteRule ^$ /subdirectory/ [L]
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]