首页 > 解决方案 > 如何将根目录中的所有文件仅重定向到另一个目录?

问题描述

我一直在寻找一段时间,但我找不到类似的东西。我有一个具有多种 URL 结构的网站。一些 URL 来自根目录,另一些则具有各种文件夹和路径。现在,我需要能够将所有路径从根目录重定向到另一个文件夹,但为来自其他文件夹的文件保留不同的结构

例如,这种模式:

在此示例中mypage, 和mysecondpage是要传递到目标的变量。

但是,对于来自根目录中另一个文件夹的页面,我需要在目的地使用另一种模式。例如:

在这个例子中,somepage是应该传递到目的地的模式。

第二种类型的重定向不应该改变第一种,反之亦然。

我为第一个指令所做的(根目录中的任何文件,但只有根目录中的文件应该重定向到另一个文件夹)是:

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule (.*) /foldername/$1/content.php [L]

...其中$1等于来自 的名称(.*)。这本身就很好用,保存旧 URL 但从另一个文件夹中获取内容。

对于第二个指令(从一个文件夹到另一个文件夹的文件,保留名称并添加扩展名)我做了:

RewriteRule ^foldername/(.*) /anotherfolder/$1.php [L]

...在哪里$1等于(.*)。里面的所有内容都foldername保留其旧 URL,但从anotherfolder.

一切都单独工作,但不能一起工作。有任何想法吗?

标签: apache.htaccessmod-rewrite

解决方案


您的第二条规则与第一条规则中重写的 URL 匹配,因此第二次被重写 - 格式错误,例如/anotherfolder/mypage/content.php.php. 如果不是针对检查REDIRECT_STATUS环境变量的第一条规则的条件,您将有一个重写循环。

您似乎可以通过使正则表达式更具体来避免冲突(以及两个规则的条件) - 您只想匹配根目录或子目录中的路径段,而不是所有内容

请尝试以下操作:

# Rewrite root files to another folder
RewriteRule ^([^/]+)$ /foldername/$1/content.php [L]

# Rewrite requests for /foldername/somepage to /anotherfolder
RewriteRule ^foldername/([^/]+)$ /anotherfolder/$1.php [L]

通过使正则表达式更具限制性,我们避免了冲突。


推荐阅读