使用 .htaccess 重写文件夹

Rewrite folders with .htaccess

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

/
/folderA/
/folderB/
/index/

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

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

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

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

RewriteRule ^$ /index/ [L]

并且由于根目录是一个目录,您最好将其从第一条规则中排除。 IE。将 (.*) 更改为 (.+).

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

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

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

例如:

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