首页 > 解决方案 > 使用 .htaccess 重写文件夹

问题描述

对于网站,我想使用 .htaccess 设置重定向。我的文件夹结构类似于

/
/folderA/
/folderB/
/index/

其中 folderA 和 B 以及 index 包含子文件夹和文件。现在,我想将对根目录/以及所有不存在的文件夹和文件的所有请求重写为index. 它应该被屏蔽。在我看来,这是一项简单的任务,但我无法让它发挥作用。到目前为止,我尝试过

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) /index/$1 [L]

重定向以某种方式起作用,但是当我直接调用根http://example.org/时它不起作用 。根目录是否也被视为有效目录或在 RewriteCond 检查中被排除?任何想法如何实现?

标签: .htaccessmod-rewrite

解决方案


是的,根也是一个目录。您将需要添加另一个规则来仅重写根。例如:

RewriteRule ^$ /index/ [L]

而且由于根是一个目录,您不妨从第一条规则中排除它。IE。更改(.*)(.+)

/index/...但是,如果您要重写的 URL也不存在*1,您现有的规则将导致重写循环(500 错误)。例如。如果您请求/foo,它将重写为/index/foo,如果/index/foo不存在,则重写/index/index/foo/index/index/index/foo等。

您将需要添加一个附加条件(或使用否定前瞻)以防止对/index/...自身的请求被重写。

( *1除非您在包含 mod_rewrite 指令.htaccess的子目录中有另一个文件/index并且您没有启用 mod_rewrite 继承。)

例如:

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/index/
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.+) /index/$1 [L]
RewriteRule ^$ /index/ [L]

推荐阅读