我正在清理域名的目录结构(在根目录中设置root url的内容对我来说很糟糕!)并且需要了解如何正确使用RewriteRule。
要点
我希望 domain.tld 使用 domain.tld / subdirectory / ,但仍然在网址中显示为 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效果很好。不幸的是,似乎最后一个RewriteRule 应该工作得足够简单,但事实并非如此。仍会显示根目录中的旧内容设置。
我在这里缺少什么?
更新:已解决
简单的修复,我对.htaccess / apache没有经验,能够解释原因。
我有:
RewriteRule ^/$ /subdirectory/?$ [L]
删除一个斜杠修复了所有内容:
RewriteRule ^$ /subdirectory/?$ [L]
所以现在我的问题是:为什么会这样?
答案 0 :(得分:2)
试试这个:
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 斯皮罗斯
答案 1 :(得分:0)
RewriteRule
中的URI部分不包含前面的斜杠。
为了匹配http://example.com/
,您必须使用RewriteRule ^$
,其中RewriteRule ^/$
理论上匹配http://example.com//
(请注意双斜杠)。
附加:?$
在最后没有任何意义,因为这会添加一个带有空参数$
的查询字符串。
最后你有:RewriteRule ^$ /subdirectory/ [L,QSA]
答案 2 :(得分:0)
这两项规则都是有效:
这个用于服务器配置或虚拟主机上下文( URL以前导斜杠开头):
RewriteRule ^/$ /subdirectory/ [L]
如果您在 .htaccess 中放置相同的规则,则必须删除前导斜杠(,因为它相对于当前文件夹):
RewriteRule ^$ /subdirectory/ [L]
<强> P.S。强>
Floern已经提到了?$
它的目标URL部分。根本不需要$
。如果您使用?
完成了URL,则告诉Apache不要将查询字符串转移到新URL(完全删除查询字符串)。
此外,仅当您使用查询字符串进行操作(目标URL中包含[QSA]
)并且仍希望将当前查询字符串附加到新构建的URL时,才需要?
标志。这意味着在此规则中RewriteRule ^$ /subdirectory/ [L,QSA]
[QSA]
标记根本不执行任何操作,可以安全删除。
答案 3 :(得分:0)
我尝试了解决方案,但在我的情况下删除/ folder / BUT显示旧网站(www.site.it)而不是www.site.it/folder/与&#39;文件夹&#39;删除...我复制并粘贴相同的代码,但在我的情况下不起作用:(我开了一个新主题:.htaccess: Redirect root wordpress url to another wordpress in a subdirectory, but retain root url