Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache .htaccess:将根url重定向到子目录,但保留根url_Apache_.htaccess_Mod Rewrite - Fatal编程技术网

Apache .htaccess:将根url重定向到子目录,但保留根url

Apache .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

我正在清理我的域的目录结构(在根目录中设置根url的内容对我来说太糟糕了!),需要了解如何正确使用重写规则

要点

我希望domain.tld使用domain.tld/subdirectory/,但在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]
比赛进行得很好。不幸的是,最后一条重写规则似乎应该足够简单,但事实并非如此。根目录中的旧内容设置仍然显示

我错过了什么

更新:已解决

这是一个简单的修正,我对.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]